如何将cv :: Mat转换为ros中的sensor_msgs?

时间:2014-11-22 17:05:46

标签: c++ pointers opencv type-conversion ros

我正在尝试将cv :: Mat转换为sensor_msgs,以便我可以在ROS中发布它。

我的代码就像这样:

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 :: Image,

但fillImage的第六个参数必须是void *而不是Mat *


希望有人能帮助我!

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

提前THX!

2 个答案:

答案 0 :(得分:5)

使用以下代码

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

答案 1 :(得分:1)

我认为最好的方法是阅读ROS教程Converting between ROS images and OpenCV images (C++)

  

本教程通过使用cv_bridge将ROS图像转换为OpenCV图像(反之亦然)来描述如何连接ROS和OpenCV。包含一个示例节点,可用作您自己节点的模板。