ROS是机器人领域中比较受到关注的一种系统,它的应用比较方便而且有许多的工具比如传感器驱动包可以直接使用。但是ROS对于传感器数据有自己的格式和规范。而在OpenCV中,图像是以Mat矩阵的形式存储的,这与ROS定义的图像消息的格式有一定的区别,所以我们需要利用cv_bridge将这两种不相同的格式联系起来,如下图所示

1. ROS图像消息转换为OpenCV图像的函数
cv_bridge源码中执行转换的类为CvImage,该类包含了OpenCV的Mat格式的图像、该消息的encoding以及ROS header。类在源码中的定义如下:

namespace cv_bridge {class CvImage{public:std_msgs::Header header;std::string encoding;cv::Mat image;};typedef boost::shared_ptr<CvImage> CvImagePtr;typedef boost::shared_ptr<CvImage const> CvImageConstPtr;
}

当cv_bridge将ROS的图像消息转换为OpenCV图像格式时都是通过CvImage类实现的。一般来说,cv_bridge提供了两种方式转换为CvImage类,分别为复制(copy)和共享(share)。

 // Case 1: Always copy, returning a mutable CvImageCvImagePtr toCvCopy(const sensor_msgs::ImageConstPtr& source,const std::string& encoding = std::string());CvImagePtr toCvCopy(const sensor_msgs::Image& source,const std::string& encoding = std::string());// Case 2: Share if possible, returning a const CvImageCvImageConstPtr toCvShare(const sensor_msgs::ImageConstPtr& source,const std::string& encoding = std::string());CvImageConstPtr toCvShare(const sensor_msgs::Image& source,const boost::shared_ptr<void const>& tracked_object,const std::string& encoding = std::string());

上面是这两类方式实现的函数对应为toCvCopy和toCvShare,两个函数的输入有两个:图像消息的指针和可选的编码参数。这两个函数的区别:

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

cv::Mat img;
cv_bridge::CvImagePtr cv_ptr;
cv_ptr = cv_bridge::toCvCopy(msg, "mono8");
cv_ptr->image.copyTo(img);

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

cv::Mat img;
cv_bridge::CvImageConstPtr cv_ptr;
cv_ptr=cv_bridge::toCvShare(msg, "mono8");
img = cv_ptr->image;

CvBridge中常用的编码有以下那么几种:

mono8: CV_8UC1, grayscale imagemono16: CV_16UC1, 16-bit grayscale imagebgr8: CV_8UC3, color image with blue-green-red color orderrgb8: CV_8UC3, color image with red-green-blue color orderbgra8: CV_8UC4, BGR color image with an alpha channelrgba8: CV_8UC4, RGB color image with an alpha channel

2. OpenCV图像转换为ROS消息的函数
在CvImage类中执行的OpenCV图像转换为ROS消息的成员函数为 toImageMsg(),其源码中的定义如下所示:

class CvImage
{sensor_msgs::ImagePtr toImageMsg() const;// Overload mainly intended for aggregate messages that contain// a sensor_msgs::Image as a member.void toImageMsg(sensor_msgs::Image& ros_image) const;
};

该函数的输入有三个:标准消息包的头、图像编码和OpenCV源图像,使用例程如下:

cv::Mat image = cv::imread(......);
sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image).toImageMsg();

参考文献

  • http://wiki.ros.org/vision_opencv

cv_bridge使用笔记相关推荐

  1. ROS(Robot Operating System)笔记 : 2.创建并配置package

    ROS(Robot Operating System)笔记 : 2.创建一个ROS包并设置其依赖 1.首先来到ros的工作目录下,接着使用 catkin_make + [包名称] + [依赖1] + ...

  2. ROS中阶笔记(五):机器人感知—机器视觉

    ROS中阶笔记(五):机器人感知-机器视觉 文章目录 1 ROS中的图像数据 1.1 二维图像 1.1.1 安装安装usb_cam 1.1.2 显示图像数据 1.2 三维图像(kinect) 2 摄像 ...

  3. Ubuntu_ROS中应用kinect v2笔记

    Ubuntu_ROS中应用kinect v2笔记 个人觉得最重要的资料如下: 1. Microsoft Kinect v2 Driver Released http://www.ros.org/new ...

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

    ROS是机器人领域中比较受到关注的一种系统,它的应用比较方便而且有许多的工具比如传感器驱动包可以直接使用.但是ROS对于传感器数据有自己的格式和规范.而在OpenCV中,图像是以Mat矩阵的形式存储的 ...

  5. 【转载】VINS-Mono环境配置与测试笔记

    VINS-Mono环境配置与测试笔记 标签: SLAM VINS-mono 本文转载自: VINS-Mono环境配置与测试笔记 error:cv_bridge---opencv和ros连接起来的桥 1 ...

  6. Vins-Mono+Fusion 学习笔记(二)

    目录 目录 一.特征点 二.feature_tracker_node 三.读取相机参数 四.main函数 五.光流法 六.剔除特征点 七.特征点均匀化 上一节笔记的链接: Vins-Mono+Fusi ...

  7. Slam学习笔记——ROS踩坑记录

    Slam学习笔记--ROS踩坑记录 1. 安装 2. ROS文件系统 2.1 工作区 2.2 包package 2.2.1 包的操作 2.2.2 描述文件package.xml 2.3 节点node ...

  8. 【读书笔记】知易行难,多实践

    前言: 其实,我不喜欢看书,只是喜欢找答案,想通过专业的解答来解决我生活的困惑.所以,我听了很多书,也看了很多书,但看完书,没有很多的实践,导致我并不很深入在很多时候. 分享读书笔记: <高效1 ...

  9. 【运维学习笔记】生命不息,搞事开始。。。

    001生命不息,搞事不止!!! 这段时间和hexesdesu搞了很多事情! 之前是机械硬盘和固态硬盘的测速,我就在那默默的看着他一个硬盘一个机械测来测去. 坐在他后面,每天都能看到这位萌萌的小男孩,各 ...

最新文章

  1. pytorch环境安装(配置:CUDA11.1+CUDNN11.1+torch.9.0+cu111+torchvision0.10.0+cu111+torchaudio==0.9.0)
  2. .Net 中接口应用的知识点(排序)
  3. 6 计算机组成原理第五章 中央处理器 CPU功能和结构 指令执行过程
  4. C语言 数组内存溢出 - C语言零基础入门教程
  5. python的人工智能和c++的有什么区别_为什么人工智能岗位有些招聘C/C 有些招聘Python到底哪门编程语言更重要(恰恰相反C++在人工智能方面的用处很大)...
  6. Android 自定义ImageView加载图片
  7. mac版mysql 1290_Mac 终端下mysql load data infile 文件路径 into table 表名称 操作,[Error Code] 1290 - The MyS...
  8. c调用python keras模型_tensorflow中调用keras训练模型作为一个计算过程
  9. go语言 读文件最后一行_Go 语言核心文件调试
  10. mac 下载appium
  11. 【控制】PID和LQR
  12. 使用DOSBox自动进入debug模式
  13. 华为云认证体系介绍,认证的必要性
  14. cout 声明与定义
  15. python判断三角形程序_python三角形判定怎么做
  16. 计算机丢失quartz.dll什么意思,教你win10系统quartz.dll丢失找不到指定模块的解决教程...
  17. Unity 程序始终显示在最上层,并且保持交互。
  18. asp.net毕业设计家电维修保养信息系统
  19. Selenium IDE使用指南二(命令行运行器)
  20. 三维空间中的平面方程

热门文章

  1. grep的常用命令语法
  2. 使用idea创建springboot项目并打成war包发布到weblogic上...
  3. ActiveMQ(li)
  4. FileMaker中的腳本觸發器學習筆記
  5. exchange 2010 search mailbox 的幕后强大功能
  6. 代码 设计 生活 (2)--- 菜鸟
  7. 以太坊:比特币 + 无限可能
  8. 数据结构的简要介绍:图形如何工作
  9. 今日头条反爬措施形同虚设,论多平台协同在安全方面的重要性
  10. 【HTTP协议】域名