Skip to content

Commit 2f20499

Browse files
bjsowaMatthew Bries
andcommitted
Add support for alpha pngs by adding per stream type decode functions (backport #106)
Co-authored-by: Matthew Bries <[email protected]>
1 parent bc92480 commit 2f20499

File tree

4 files changed

+47
-16
lines changed

4 files changed

+47
-16
lines changed

include/web_video_server/image_streamer.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ class ImageTransportImageStreamer : public ImageStreamer
6060
virtual void start();
6161

6262
protected:
63+
virtual cv::Mat decodeImage(const sensor_msgs::msg::Image::ConstSharedPtr & msg);
6364
virtual void sendImage(const cv::Mat &, const rclcpp::Time & time) = 0;
6465
virtual void restreamFrame(double max_age);
6566
virtual void initialize(const cv::Mat &);

include/web_video_server/png_streamers.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class PngStreamer : public ImageTransportImageStreamer
2121

2222
protected:
2323
virtual void sendImage(const cv::Mat &, const rclcpp::Time & time);
24+
virtual cv::Mat decodeImage(const sensor_msgs::msg::Image::ConstSharedPtr & msg);
2425

2526
private:
2627
MultipartStream stream_;
@@ -47,6 +48,7 @@ class PngSnapshotStreamer : public ImageTransportImageStreamer
4748

4849
protected:
4950
virtual void sendImage(const cv::Mat &, const rclcpp::Time & time);
51+
virtual cv::Mat decodeImage(const sensor_msgs::msg::Image::ConstSharedPtr & msg);
5052

5153
private:
5254
int quality_;

src/image_streamer.cpp

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,26 @@ void ImageTransportImageStreamer::restreamFrame(double max_age)
108108
}
109109
}
110110

111+
cv::Mat ImageTransportImageStreamer::decodeImage(
112+
const sensor_msgs::msg::Image::ConstSharedPtr & msg)
113+
{
114+
if (msg->encoding.find("F") != std::string::npos) {
115+
// scale floating point images
116+
cv::Mat float_image_bridge = cv_bridge::toCvCopy(msg, msg->encoding)->image;
117+
cv::Mat_<float> float_image = float_image_bridge;
118+
double max_val;
119+
cv::minMaxIdx(float_image, 0, &max_val);
120+
121+
if (max_val > 0) {
122+
float_image *= (255 / max_val);
123+
}
124+
return float_image;
125+
} else {
126+
// Convert to OpenCV native BGR color
127+
return cv_bridge::toCvCopy(msg, "bgr8")->image;
128+
}
129+
}
130+
111131
void ImageTransportImageStreamer::imageCallback(const sensor_msgs::msg::Image::ConstSharedPtr & msg)
112132
{
113133
if (inactive_) {
@@ -116,22 +136,7 @@ void ImageTransportImageStreamer::imageCallback(const sensor_msgs::msg::Image::C
116136

117137
cv::Mat img;
118138
try {
119-
if (msg->encoding.find("F") != std::string::npos) {
120-
// scale floating point images
121-
cv::Mat float_image_bridge = cv_bridge::toCvCopy(msg, msg->encoding)->image;
122-
cv::Mat_<float> float_image = float_image_bridge;
123-
double max_val;
124-
cv::minMaxIdx(float_image, 0, &max_val);
125-
126-
if (max_val > 0) {
127-
float_image *= (255 / max_val);
128-
}
129-
img = float_image;
130-
} else {
131-
// Convert to OpenCV native BGR color
132-
img = cv_bridge::toCvCopy(msg, "bgr8")->image;
133-
}
134-
139+
img = decodeImage(msg);
135140
int input_width = img.cols;
136141
int input_height = img.rows;
137142

src/png_streamers.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "web_video_server/png_streamers.hpp"
22
#include "async_web_server_cpp/http_reply.hpp"
3+
#include "cv_bridge/cv_bridge.hpp"
34

45
namespace web_video_server
56
{
@@ -20,6 +21,17 @@ PngStreamer::~PngStreamer()
2021
boost::mutex::scoped_lock lock(send_mutex_); // protects sendImage.
2122
}
2223

24+
cv::Mat PngStreamer::decodeImage(const sensor_msgs::msg::Image::ConstSharedPtr & msg)
25+
{
26+
// Handle alpha values since PNG supports it
27+
if (sensor_msgs::image_encodings::hasAlpha(msg->encoding)) {
28+
return cv_bridge::toCvCopy(msg, "bgra8")->image;
29+
} else {
30+
// Use the normal decode otherwise
31+
return ImageTransportImageStreamer::decodeImage(msg);
32+
}
33+
}
34+
2335
void PngStreamer::sendImage(const cv::Mat & img, const rclcpp::Time & time)
2436
{
2537
std::vector<int> encode_params;
@@ -64,6 +76,17 @@ PngSnapshotStreamer::~PngSnapshotStreamer()
6476
boost::mutex::scoped_lock lock(send_mutex_); // protects sendImage.
6577
}
6678

79+
cv::Mat PngSnapshotStreamer::decodeImage(const sensor_msgs::msg::Image::ConstSharedPtr & msg)
80+
{
81+
// Handle alpha values since PNG supports it
82+
if (sensor_msgs::image_encodings::hasAlpha(msg->encoding)) {
83+
return cv_bridge::toCvCopy(msg, "bgra8")->image;
84+
} else {
85+
// Use the normal decode otherwise
86+
return ImageTransportImageStreamer::decodeImage(msg);
87+
}
88+
}
89+
6790
void PngSnapshotStreamer::sendImage(const cv::Mat & img, const rclcpp::Time & time)
6891
{
6992
std::vector<int> encode_params;

0 commit comments

Comments
 (0)