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. Windows Embedded Standard开发初体验(四)
  2. 安装HCL遇到的问题
  3. C++ 标准库中的异常
  4. 盘它:1200 天积淀,超 750 篇干货,为你甄选这 100 + 篇精华!
  5. OpenCV Tracker简介
  6. 64位服务器IIS不能识别32位framework版本。IIS没有Asp.net切换界面的解决办法。
  7. vs及番茄助手快捷键使用介绍
  8. P3538-[POI2012]OKR-A Horrible Poem【hash,字符串】
  9. 分拣外观残缺的机器人_一款分拣搬运机器人的设计
  10. C++语言 对话框程序设计
  11. java w732_技术联盟W732系统下载
  12. Mybatis mapper代理SqlMapConfig.xml配置详解
  13. 用javascript实现点击按钮删除一个文本框
  14. 手算逆元及手动模拟扩展欧几里得算法及思路推导
  15. 微软宣布446亿美元收购雅虎
  16. 解决Visio和office365安装兼容问题
  17. 在Word中利用日历向导查农历
  18. win10 SystemParametersInfo 设置屏保 不好使_[教程]win10 ,ubuntu双系统安装避坑指南
  19. 左方之地 - 结论 - 组合计数
  20. Android控件外边框自定义

热门文章

  1. 王小草【深度学习】笔记第二弹--细说卷积神经网络
  2. java面试高频点深入第三期
  3. blender中UV贴图及导出dae文件
  4. 重庆将建国际消费中心城市
  5. Android应用的权限配置和权限列表(仅供参考)
  6. 人脸识别系列(十四):NormFace
  7. 总结一下过去的一年吧
  8. 数据库---MySQL常用函数总结
  9. FXCG重组升级,获得开曼CIMA监管许可证
  10. 【总结】Linux 下查看麦克风或音频采集设备