cv_bridge用于ROS图像和OpenCV图像的转换

一、背景

ROS对于传感器数据有自己的格式和规范。而在OpenCV中,图像是以Mat矩阵的形式存储的,这与ROS定义的图像消息的格式有一定的区别,所以我们需要利用cv_bridge将这两种不相同的格式联系起来。

二、ros图像转化为opencv图像

(1)使用copy的方式

toCvCopy函数会从ROS消息中拷贝一个图像数据,不管如何修改CvImage类的内容都不会影响源数据,使用例子如下。

# include 
# include 
# incldue 
# include 
# include 

using namespace std;
using namespace cv;

int main (int argc,char** argv)
{
    sensor_msgs::ImagePtr msg;//ros类型图像 ,sensor_msgs::ImagePtr msg和sensor_msgs::ImageConstPtr msg一样,感觉加不加Const一样
    Mat img;
    cv_bridge::CvImagePtr cv_ptr; // cv_bridge::CvImagePtr cv_ptr和cv_bridge::CvImageConstPtr cv_ptr一样,感觉加不加Const一样
    cv_ptr = cv_bridge::toCvCopy(msg, "brg8");//"brg8"为编码格式,可以默认
    img = cv_ptr->image;//opencv类型图像,这一行等价于cv_ptr->image.copyTo(img);
    return 0
}

(2)使用share的方式

toCvShare函数则是在源和编码都匹配的情况下将返回的OpenCV指针指向ROS的消息,即共享指针地址。它的特点是只要你还保持着返回的CvImage类的副本,那么ROS的消息类型就不会被释放。当编码参数不匹配时,它还能够另外开辟一个新的缓存区并执行编码参数转换工作。toCvShare函数对于有一个指向另一个相同类型消息的指针时会很方便(比如双目图像)。如果没有给定编码类型时,toCvShare会使目标图像编码将会与消息编码相同。toCvShare函数的使用例子如下。

# include 
# include 
# incldue 
# include 
# include 

using namespace std;
using namespace cv;

int main (int argc,char** argv)
{
    sensor_msgs::ImagePtr msg;//ros类型图像 
    Mat img;
    cv_bridge::CvImagePtr cv_ptr;// cv_bridge::CvImagePtr cv_ptr和cv_bridge::CvImageConstPtr cv_ptr一样,感觉加不加Const一样
    cv_ptr=cv_bridge::toCvShare(msg, "mono8");//"brg8"为编码格式,可以默认
    img = cv_ptr->image;//opencv类型图像,这一行等价于cv_ptr->image.copyTo(img);
    return 0
}

三、opencv图像转化为ros图像

# include 
# include 
# incldue 
# include 
# include 

using namespace std;
using namespace cv;

int main (int argc,char** argv)
{
    Mat image = cv::imread(......);//opencv图像
    sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image).toImageMsg();//其他参数基本固定,就改改image即可。sensor_msgs::ImageConstPtr msg和sensor_msgs::ImagePtr msg一样,感觉加不加Const一样
    return 0
}

你可能感兴趣的:(OpenCV,c++)