2014-11-22 47 views
3

我想将一个cv :: Mat转换为一个sensor_msgs,以便我可以在ROS中发布这个。如何将cv :: Mat转换为ros中的sensor_msgs?

我的代码仅仅是这样的:

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(); 
     } 

我已经尝试了两种可能的解决方案:

[1]使用cv_bridge,CvImagePtr和toImageMsg(),但CvImagePtr报告

断言(px!0)错误,我猜这意味着我必须初始化CvImagePtr。

但我不知道如何初始化它;

[2]使用fillImage和sensor_msgs ::图片,

但fillImage的第六个参数必须是*代替垫*


希望有人可以帮助我一个空白!

是否有一种将cv :: Mat(或IplImage)转换为sensor_msgs的有效方法?

THX提前!

+0

看看这里:HTTP:/ /wiki.ros.org/cv_bridge/Tutorials/UsingCvBridgeToConvertBetweenROSImagesAndOpenCVImages (和这里:http://answers.ros.org/question/9765/how-to-convert-cvmat-to-sensor_msgsimageptr/) – alextoind 2014-11-23 10:29:31

+0

thx亚历克斯,第二个链接帮助很多! – 2014-11-24 03:38:59

回答

2

使用下面的代码

#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);