一、背景
ROS对于传感器数据有自己的格式和规范。而在OpenCV中,图像是以Mat矩阵的形式存储的,这与ROS定义的图像消息的格式有一定的区别,所以我们需要利用cv_bridge将这两种不相同的格式联系起来。
二、ros图像转化为opencv图像
(1)使用copy的方式
toCvCopy函数会从ROS消息中拷贝一个图像数据,不管如何修改CvImage类的内容都不会影响源数据,使用例子如下。
# include <cv_bridge/cv_bridge.h>
# include <opencv2/opencv.hpp>
# incldue <iostream>
# include <ros/ros.h>
# include <sensor_msgs/Image.h>
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 <cv_bridge/cv_bridge.h>
# include <opencv2/opencv.hpp>
# incldue <iostream>
# include <ros/ros.h>
# include <sensor_msgs/Image.h>
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 <cv_bridge/cv_bridge.h>
# include <opencv2/opencv.hpp>
# incldue <iostream>
# include <ros/ros.h>
# include <sensor_msgs/Image.h>
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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)