2014-11-22 48 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);