Ros下使用OpenCV对图像进行处理
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对图像进行处理相关推荐
- 角蜂鸟AI视觉套件:(四)ROS下订阅并处理图像
对于熟悉ROS的朋友们来说,图像的topic有了,我们就可以开始自己想干的事情了.这里我创建一个名为hs_image_sub的package来处理角蜂鸟的图像,图像的topic 名字为上一篇提到的:/ ...
- 在ROS下利用OpenCV的Mat类,将激光点云展开为深度图像(从零开始,超详细)
激光雷达3D目标检测任务需要将地面滤除,滤除地面的方法多种多样:基于深度学习.基于栅格.基于平面拟合.基于条件随机场.基于深度图像等等.关于将点云转化为深度图像,PCL库中有相关函数,但使用起来有一定 ...
- Ubuntu下使用opencv完成图像程序编程操作
前言 一.安装opencv 1.1安装环境 1.2下载OpenCV 1.3解压opencv包 1.4使用cmake安装opencv 1.5使用 make 创建编译 1.6安装 1.7配置环境 二.实例 ...
- Ubuntu系统下基于Opencv完成图像编程
文章目录 一.OpenCV简介 二.安装OpenCV 2.1 安装包下载 2.2 使用cmake安装 2.3 配置环境 三.使用实例 3.1 图片运用 3.2 视频运用 四.总结 五.参考文献 一.O ...
- 使用大恒水星相机利用OpenCV+ Zbar 解QR码在ROS下定位的实现
使用大恒水星相机利用OpenCV+ Zbar 解QR码在ROS下定位的实现 本次的程序功能实现是在师兄原有程序的基础上,经我继续开发的.主要完成的功能是使用QR码定位,将位姿信息通过ROS中的tf变换 ...
- ROS下UVC免驱高速摄像头图像读取以及利用image_transport进行图像传递
网上可以买到很多高速摄像头模块,常见的就是这个ov2710模组,采用uvc免驱,号称在1080p 30fps,720p 60fps以及VGA 120fps. 值得是注意的是,这些高速模式都是在MJPG ...
- ROS下获取USB免驱动高速摄像头图像数据
开发环境 使用uvc_camera package 1. 安装uvc_camera package 2. 测试和查看安装结果 3. 配置自己的.launch文件 深入研究库文件 开发环境 PC系统 u ...
- opencv:用最邻近插值和双线性插值法实现上采样(放大图像)与下采样(缩小图像)
上采样与下采样 概念: 上采样: 放大图像(或称为上采样(upsampling)或图像插值(interpolating))的主要目的 是放大原图像,从而可以显示在更高分辨率的显示设备上. 下采样: 缩 ...
- 深入理解ROS技术 【1】ROS下的模块详解(1-65)
ROS初探--意义.基本模块_Peace-CSDN博客 概述: 初学者要想快速入门,必须对于众多的ROS模块初步有个认识,需要主动地.有计划地查阅.本篇以字典方式,列出所有的Ros下模块,给出初步解释 ...
最新文章
- 浅析日常网站建设中运营与优化的工作重点
- C语言中的位域 bit field [转]
- socket编程之中的一个:计算机网络基础
- php生成对象吗,php生成器对象
- 源码包编译安装python_Python3.7源码包编译安装-Go语言中文社区
- 将10000H-1000FH这段空间当做栈,初始状态栈是空的,设置AX=001AH,BX=001BH,利用栈,交换AX和BX的数据
- 码农节快乐|一个系统,高效解决复杂事件采集-计算-实时触达
- PCA降维算法的原理及应用
- 水晶头(网线)的线序
- Content type ‘application/json;charset=UTF-8‘ not supp...
- 串的基本操作与KMP算法
- 阿里云日本区正式开服 飞天系统全球化部署格局初定
- VC中鼠标移动点击操作
- java 学习之路建议
- 如何修复excel文件损坏
- 我以前的痛苦,你也拥有吗?
- 学完教程,不知道接下去从哪里开始做自己的第一个APP,怎么办?酷课堂iOS交流群问答(201902期)
- python画厢式图_用matplotlib画箱体图(boxplot)
- 用MAC系统写C语言程序
- cmd命令 从C盘跳到D盘