How to convert cv :: Mat to sensor_msgs in ros?
I am trying to convert cv :: Mat to sensor_msgs so that I can post this to ROS.
my code looks like this:
while(ros::ok())
{
capture >> frame;
cv::imshow("Preview" , frame);
cv::waitKey(1);
//sensor_msgs::Image img_;
//fillImage(img_ , "rgb8" , frame.rows , frame.cols , 3 * frame.cols , frame);
//img_header.stamp = ros::Time::now();
//cv_bridge::CvImagePtr cv_ptr;
//cv_ptr->image = frame;
//image_pub_.publish(img_);
ros::spinOnce();
}
I tried two possible solutions:
[1] using cv_bridge, CvImagePtr and toImageMsg () but report CvImagePtr
assert (px! 0), which I think means I have to initialize the CvImagePtr.
But I don't know how to initialize it;
[2] using fillImage and sensor_msgs :: Image,
but the sixth parameter fillImage should be void * instead of Mat *
Hope someone can help me!
Is there an efficient way to convert cv :: Mat (or IplImage) to sensor_msgs?
thanks in advance!
+3
source to share
1 answer
-
Using image_transport: http://wiki.ros.org/image_transport/Tutorials/PublishingImages
-
Using the cv_bridge interface and setting the header manually
Use the following code
#include <sensor_msgs/Image.h>
#include <sensor_msgs/image_encodings.h>
#include <cv_bridge/cv_bridge.h>
cv::Mat img; // << image MUST be contained here
cv_bridge::CvImage img_bridge;
sensor_msgs::Image img_msg; // >> message to be sent
std_msgs::Header header; // empty header
header.seq = counter; // user defined counter
header.stamp = ros::Time::now(); // time
img_bridge = cv_bridge::CvImage(header, sensor_msgs::image_encodings::RGB8, img);
img_bridge.toImageMsg(img_msg); // from cv_bridge to sensor_msgs::Image
pub_img.publish(img_msg); // ros::Publisher pub_img = node.advertise<sensor_msgs::Image>("topic", queuesize);
+2
source to share