Skip to content

Commit 70aa532

Browse files
matt-attackMatthew Bries
andauthored
Add support for alpha pngs by adding per stream type decode functions (#106)
Co-authored-by: Matthew Bries <[email protected]>
1 parent d6eaa8f commit 70aa532

File tree

4 files changed

+58
-19
lines changed

4 files changed

+58
-19
lines changed

include/web_video_server/image_streamer.h

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

5757
protected:
58+
virtual cv::Mat decodeImage(const sensor_msgs::ImageConstPtr& msg);
5859
virtual void sendImage(const cv::Mat &, const ros::Time &time) = 0;
5960
virtual void restreamFrame(double max_age);
6061
virtual void initialize(const cv::Mat &);

include/web_video_server/png_streamers.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class PngStreamer : public ImageTransportImageStreamer
1919
~PngStreamer();
2020
protected:
2121
virtual void sendImage(const cv::Mat &, const ros::Time &time);
22+
virtual cv::Mat decodeImage(const sensor_msgs::ImageConstPtr& msg);
2223

2324
private:
2425
MultipartStream stream_;
@@ -42,6 +43,7 @@ class PngSnapshotStreamer : public ImageTransportImageStreamer
4243
~PngSnapshotStreamer();
4344
protected:
4445
virtual void sendImage(const cv::Mat &, const ros::Time &time);
46+
virtual cv::Mat decodeImage(const sensor_msgs::ImageConstPtr& msg);
4547

4648
private:
4749
int quality_;

src/image_streamer.cpp

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,29 @@ void ImageTransportImageStreamer::restreamFrame(double max_age)
8181
}
8282
}
8383

84+
cv::Mat ImageTransportImageStreamer::decodeImage(const sensor_msgs::ImageConstPtr& msg)
85+
{
86+
if (msg->encoding.find("F") != std::string::npos)
87+
{
88+
// scale floating point images
89+
cv::Mat float_image_bridge = cv_bridge::toCvCopy(msg, msg->encoding)->image;
90+
cv::Mat_<float> float_image = float_image_bridge;
91+
double max_val;
92+
cv::minMaxIdx(float_image, 0, &max_val);
93+
94+
if (max_val > 0)
95+
{
96+
float_image *= (255 / max_val);
97+
}
98+
return float_image;
99+
}
100+
else
101+
{
102+
// Convert to OpenCV native BGR color
103+
return cv_bridge::toCvCopy(msg, "bgr8")->image;
104+
}
105+
}
106+
84107
void ImageTransportImageStreamer::imageCallback(const sensor_msgs::ImageConstPtr &msg)
85108
{
86109
if (inactive_)
@@ -89,25 +112,7 @@ void ImageTransportImageStreamer::imageCallback(const sensor_msgs::ImageConstPtr
89112
cv::Mat img;
90113
try
91114
{
92-
if (msg->encoding.find("F") != std::string::npos)
93-
{
94-
// scale floating point images
95-
cv::Mat float_image_bridge = cv_bridge::toCvCopy(msg, msg->encoding)->image;
96-
cv::Mat_<float> float_image = float_image_bridge;
97-
double max_val;
98-
cv::minMaxIdx(float_image, 0, &max_val);
99-
100-
if (max_val > 0)
101-
{
102-
float_image *= (255 / max_val);
103-
}
104-
img = float_image;
105-
}
106-
else
107-
{
108-
// Convert to OpenCV native BGR color
109-
img = cv_bridge::toCvCopy(msg, "bgr8")->image;
110-
}
115+
img = decodeImage(msg);
111116

112117
int input_width = img.cols;
113118
int input_height = img.rows;

src/png_streamers.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#include "web_video_server/png_streamers.h"
22
#include "async_web_server_cpp/http_reply.hpp"
33

4+
#include <cv_bridge/cv_bridge.h>
5+
46
namespace web_video_server
57
{
68

@@ -18,6 +20,21 @@ PngStreamer::~PngStreamer()
1820
boost::mutex::scoped_lock lock(send_mutex_); // protects sendImage.
1921
}
2022

23+
cv::Mat PngStreamer::decodeImage(const sensor_msgs::ImageConstPtr& msg)
24+
{
25+
// Handle alpha values since PNG supports it
26+
if (sensor_msgs::image_encodings::hasAlpha(msg->encoding))
27+
{
28+
return cv_bridge::toCvCopy(msg, "bgra8")->image;
29+
}
30+
else
31+
{
32+
// Use the normal decode otherwise
33+
return ImageTransportImageStreamer::decodeImage(msg);
34+
}
35+
}
36+
37+
2138
void PngStreamer::sendImage(const cv::Mat &img, const ros::Time &time)
2239
{
2340
std::vector<int> encode_params;
@@ -64,6 +81,20 @@ PngSnapshotStreamer::~PngSnapshotStreamer()
6481
boost::mutex::scoped_lock lock(send_mutex_); // protects sendImage.
6582
}
6683

84+
cv::Mat PngSnapshotStreamer::decodeImage(const sensor_msgs::ImageConstPtr& msg)
85+
{
86+
// Handle alpha values since PNG supports it
87+
if (sensor_msgs::image_encodings::hasAlpha(msg->encoding))
88+
{
89+
return cv_bridge::toCvCopy(msg, "bgra8")->image;
90+
}
91+
else
92+
{
93+
// Use the normal decode otherwise
94+
return ImageTransportImageStreamer::decodeImage(msg);
95+
}
96+
}
97+
6798
void PngSnapshotStreamer::sendImage(const cv::Mat &img, const ros::Time &time)
6899
{
69100
std::vector<int> encode_params;

0 commit comments

Comments
 (0)