Skip to content

Commit

Permalink
Properly deal with alpha in image compression.
Browse files Browse the repository at this point in the history
  • Loading branch information
vrabaud authored and amiller27 committed Dec 30, 2017
1 parent db94c45 commit b211b33
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 22 deletions.
54 changes: 33 additions & 21 deletions cv_bridge/src/cv_bridge.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -467,15 +467,6 @@ CvImagePtr cvtColor(const CvImageConstPtr& source,

/////////////////////////////////////// CompressedImage ///////////////////////////////////////////

cv::Mat matFromImage(const sensor_msgs::CompressedImage& source)
{
cv::Mat jpegData(1,source.data.size(),CV_8UC1);
jpegData.data = const_cast<uchar*>(&source.data[0]);
cv::InputArray data(jpegData);
cv::Mat bgrMat = cv::imdecode(data,cv::IMREAD_ANYCOLOR);
return bgrMat;
}

sensor_msgs::CompressedImagePtr CvImage::toCompressedImageMsg(const Format dst_format) const
{
sensor_msgs::CompressedImagePtr ptr = boost::make_shared<sensor_msgs::CompressedImage>();
Expand Down Expand Up @@ -523,23 +514,28 @@ void CvImage::toCompressedImageMsg(sensor_msgs::CompressedImage& ros_image, cons
{
ros_image.header = header;
cv::Mat image;
if(encoding != enc::BGR8)
if (encoding == enc::BGR8 || encoding == enc::BGRA8)
{
CvImagePtr tempThis = boost::make_shared<CvImage>(*this);
CvImagePtr temp = cvtColor(tempThis,enc::BGR8);
image = temp->image;
image = this->image;
}
else
{
image = this->image;
CvImagePtr tempThis = boost::make_shared<CvImage>(*this);
CvImagePtr temp;
if (enc::hasAlpha(encoding))
{
temp = cvtColor(tempThis, enc::BGRA8);
}
else
{
temp = cvtColor(tempThis, enc::BGR8);
}
image = temp->image;
}
std::vector<uchar> buf;

std::string format = getFormat(dst_format);
ros_image.format = format;
cv::imencode("." + format, image, buf);

ros_image.data = buf;
cv::imencode("." + format, image, ros_image.data);
}

// Deep copy data, returnee is mutable
Expand All @@ -549,11 +545,27 @@ CvImagePtr toCvCopy(const sensor_msgs::CompressedImageConstPtr& source,
return toCvCopy(*source, encoding);
}

CvImagePtr toCvCopy(const sensor_msgs::CompressedImage& source,
const std::string& encoding)
CvImagePtr toCvCopy(const sensor_msgs::CompressedImage& source, const std::string& encoding)
{
// Construct matrix pointing to source data
return toCvCopyImpl(matFromImage(source), source.header, enc::BGR8, encoding);
const cv::Mat_<uchar> in(1, source.data.size(), const_cast<uchar*>(&source.data[0]));
// Loads as BGR or BGRA.
const cv::Mat rgb_a = cv::imdecode(in, cv::IMREAD_UNCHANGED);

switch (rgb_a.channels())
{
case 4:
return toCvCopyImpl(rgb_a, source.header, enc::BGRA8, encoding);
break;
case 3:
return toCvCopyImpl(rgb_a, source.header, enc::BGR8, encoding);
break;
case 1:
return toCvCopyImpl(rgb_a, source.header, enc::MONO8, encoding);
break;
default:
return CvImagePtr();
}
}

CvImageConstPtr cvtColorForDisplay(const CvImageConstPtr& source,
Expand Down
2 changes: 1 addition & 1 deletion cv_bridge/test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# add boost directories for now
include_directories("../src")

catkin_add_gtest(${PROJECT_NAME}-utest test_endian.cpp utest.cpp utest2.cpp test_rgb_colors.cpp)
catkin_add_gtest(${PROJECT_NAME}-utest test_endian.cpp test_compression.cpp utest.cpp utest2.cpp test_rgb_colors.cpp)
target_link_libraries(${PROJECT_NAME}-utest
${PROJECT_NAME}
${OpenCV_LIBRARIES}
Expand Down

0 comments on commit b211b33

Please sign in to comment.