Ros中的图像信息是sensor_msgs/Image的格式,而OpenCV 中图像是cv:Mat格式。所以从Ros中获取的图像不能直接用OpenCV进行处理,需要进行格式转化。还好,Ros中提供了进行ROS和OpenCV之间图像信息格式转化的接口CvBridge

下面附上Ros官网提供的源码:

#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>
#include <sensor_msgs/image_encodings.h>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>static const std::string OPENCV_WINDOW = "Image window";class ImageConverter
{ros::NodeHandle nh_;image_transport::ImageTransport it_;image_transport::Subscriber image_sub_;image_transport::Publisher image_pub_;public:ImageConverter(): it_(nh_){// Subscrive to input video feed and publish output video feedimage_sub_ = it_.subscribe("/camera/image_raw", 1,&ImageConverter::imageCb, this);image_pub_ = it_.advertise("/image_converter/output_video", 1);cv::namedWindow(OPENCV_WINDOW);}~ImageConverter(){cv::destroyWindow(OPENCV_WINDOW);}void imageCb(const sensor_msgs::ImageConstPtr& msg){cv_bridge::CvImagePtr cv_ptr;try{cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);}catch (cv_bridge::Exception& e){ROS_ERROR("cv_bridge exception: %s", e.what());return;}// Draw an example circle on the video streamif (cv_ptr->image.rows > 60 && cv_ptr->image.cols > 60)cv::circle(cv_ptr->image, cv::Point(50, 50), 10, CV_RGB(255,0,0));// Update GUI Windowcv::imshow(OPENCV_WINDOW, cv_ptr->image);cv::waitKey(3);// Output modified video streamimage_pub_.publish(cv_ptr->toImageMsg());}
};int main(int argc, char** argv)
{ros::init(argc, argv, "image_converter");ImageConverter ic;ros::spin();return 0;
}

本段代码源自:
http://wiki.ros.org/cv_bridge/Tutorials/UsingCvBridgeToConvertBetweenROSImagesAndOpenCVImages

下面来解释一下里面的代码

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里定义了类CvImage,类中包含了ros的头文件,OpenCV图像信息和编码。我们可以用这个类来进行两种图像格式的转换

cv_bridge里提供了以下两种函数来将ros中的sensor_msgs::image转换为Cvimage

// Case 1: Always copy, returning a mutable CvImage
CvImagePtr 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 CvImage
CvImageConstPtr 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复制ROS消息中的图像数据,可以对返回的cvimage进行 自由修改。

toCvShare用来进行数据共享,安全地共享ROS消息中包含的数据。也就是说如果想使用opencv进行图像处理的话,使用toCvCopy

使用toImageMsg()成员函数可以将opencv图像转换成ROS图像信息

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;
};

如要进行图像处理时,直接对cv_ptr->image进行处理即可

如要对kinect2中获得的图像rgb信息进行处理,将节点订阅中的/camera/image_raw换成kinect2发布的信息即可

Ros下使用OpenCV对图像进行处理相关推荐

  1. 角蜂鸟AI视觉套件:(四)ROS下订阅并处理图像

    对于熟悉ROS的朋友们来说,图像的topic有了,我们就可以开始自己想干的事情了.这里我创建一个名为hs_image_sub的package来处理角蜂鸟的图像,图像的topic 名字为上一篇提到的:/ ...

  2. 在ROS下利用OpenCV的Mat类,将激光点云展开为深度图像(从零开始,超详细)

    激光雷达3D目标检测任务需要将地面滤除,滤除地面的方法多种多样:基于深度学习.基于栅格.基于平面拟合.基于条件随机场.基于深度图像等等.关于将点云转化为深度图像,PCL库中有相关函数,但使用起来有一定 ...

  3. Ubuntu下使用opencv完成图像程序编程操作

    前言 一.安装opencv 1.1安装环境 1.2下载OpenCV 1.3解压opencv包 1.4使用cmake安装opencv 1.5使用 make 创建编译 1.6安装 1.7配置环境 二.实例 ...

  4. Ubuntu系统下基于Opencv完成图像编程

    文章目录 一.OpenCV简介 二.安装OpenCV 2.1 安装包下载 2.2 使用cmake安装 2.3 配置环境 三.使用实例 3.1 图片运用 3.2 视频运用 四.总结 五.参考文献 一.O ...

  5. 使用大恒水星相机利用OpenCV+ Zbar 解QR码在ROS下定位的实现

    使用大恒水星相机利用OpenCV+ Zbar 解QR码在ROS下定位的实现 本次的程序功能实现是在师兄原有程序的基础上,经我继续开发的.主要完成的功能是使用QR码定位,将位姿信息通过ROS中的tf变换 ...

  6. ROS下UVC免驱高速摄像头图像读取以及利用image_transport进行图像传递

    网上可以买到很多高速摄像头模块,常见的就是这个ov2710模组,采用uvc免驱,号称在1080p 30fps,720p 60fps以及VGA 120fps. 值得是注意的是,这些高速模式都是在MJPG ...

  7. ROS下获取USB免驱动高速摄像头图像数据

    开发环境 使用uvc_camera package 1. 安装uvc_camera package 2. 测试和查看安装结果 3. 配置自己的.launch文件 深入研究库文件 开发环境 PC系统 u ...

  8. opencv:用最邻近插值和双线性插值法实现上采样(放大图像)与下采样(缩小图像)

    上采样与下采样 概念: 上采样: 放大图像(或称为上采样(upsampling)或图像插值(interpolating))的主要目的 是放大原图像,从而可以显示在更高分辨率的显示设备上. 下采样: 缩 ...

  9. 深入理解ROS技术 【1】ROS下的模块详解(1-65)

    ROS初探--意义.基本模块_Peace-CSDN博客 概述: 初学者要想快速入门,必须对于众多的ROS模块初步有个认识,需要主动地.有计划地查阅.本篇以字典方式,列出所有的Ros下模块,给出初步解释 ...

最新文章

  1. 浅析日常网站建设中运营与优化的工作重点
  2. C语言中的位域 bit field [转]
  3. socket编程之中的一个:计算机网络基础
  4. php生成对象吗,php生成器对象
  5. 源码包编译安装python_Python3.7源码包编译安装-Go语言中文社区
  6. 将10000H-1000FH这段空间当做栈,初始状态栈是空的,设置AX=001AH,BX=001BH,利用栈,交换AX和BX的数据
  7. 码农节快乐|一个系统,高效解决复杂事件采集-计算-实时触达
  8. PCA降维算法的原理及应用
  9. 水晶头(网线)的线序
  10. Content type ‘application/json;charset=UTF-8‘ not supp...
  11. 串的基本操作与KMP算法
  12. 阿里云日本区正式开服 飞天系统全球化部署格局初定
  13. VC中鼠标移动点击操作
  14. java 学习之路建议
  15. 如何修复excel文件损坏
  16. 我以前的痛苦,你也拥有吗?
  17. 学完教程,不知道接下去从哪里开始做自己的第一个APP,怎么办?酷课堂iOS交流群问答(201902期)
  18. python画厢式图_用matplotlib画箱体图(boxplot)
  19. 用MAC系统写C语言程序
  20. cmd命令 从C盘跳到D盘

热门文章

  1. 数字图像处理-图像分割-复习总结
  2. 带你了解什么是Push消息推送
  3. 老电脑跑win7卡慢的解决办法
  4. Core Dump调试
  5. codevs 1083
  6. python 循环嵌套例子,【python实例练习1】循环嵌套——“百鸡百钱”问题
  7. l易度文档管理系统-文档模板设置
  8. 为什么Firefox在内部架构中使用“ chrome://”协议?
  9. python埃及分数式_埃及分数式
  10. Feign的调用报错时,降级处理方式,fallBackFactory