环境:

Ubuntu12.04

ROS Hydro version

OpenCV 2.4.9

 

特别标注:

这篇文章首发于“北京小芽科技有限公司”的技术博客xiaoyatec.com上,所有版权归属于北京小芽科技有限公司。更多相关信息请关注北京小芽科技、小芽机器人。 

 

正文:

ROS中,OpenCV的使用,简单一句话概括就是:用ROS获取图像,然后转换成OpenCV的图像格式,后面就是OpenCV图像处理的事情了。

从规范的学习角度来说,大家应该先看看ROS中的vision_opencv功能包集,地址为:

http://wiki.ros.org/vision_opencv?distro=indigo

然后再学习里面的功能包cv_bridge,地址为:(C++版本 和 python版本,自选)

http://wiki.ros.org/cv_bridge/Tutorials

如果是简单滴学习使用方式的话,到这里就OK了,如何还想了解ros跟opencv的几何处理或者其他处理方式的话,可以分别了解以下的功能包:

image_geometry、image_common、image_pipeline、image_transport等等

 

这篇文章主要说明的是简单使用opencv的流程和原理,里面配备了人脸检测的例子。

 

首先,如果之前没有使用过opencv的话,建议在通用系统里边先装个opencv来玩玩里面的例子,待对opencv有个大体概念时,再转战到ros系统来。

对于ros系统,原理性的东西我就不多说了,这里所说的内容也是以节点为运行单位的。要完成这个流程,需要两个节点:usb_cam设备驱动程序节点 和 图像显示和图像处理节点,同时需要一个主题,即这两个节点的桥梁。

对于usb_cam设备驱动节点来说,是用来从ROS系统里获取摄像头图像的,在我的另外一篇文章《ROS中usb摄像头的使用_(usb_cam)》里边已经做过介绍,这里就不再描述,其实《ROS中usb摄像头的使用_(usb_cam)》里已经使用了opencv,但由于介绍内容的目标不一样,所以这里另外起一篇文章单独进行介绍opencv。

在讲另外一个节点前,先说说两个节点通信的桥梁:主题。其实主题就是一些变量或者结构体的集合,节点可以使用这些变量或结构体作为存储空间(即发布主题),也可以读取它们作为信息处理(订阅主题)。【这里说得比较白话文,目的在于大家好理解,主题里面涉及的内容还很多,可以参阅ros官方文献】

再来看看另外一个节点:图像显示和图像处理节点。这个节点主要就运用了opencv的内容,所以这里就重点描述一下这个节点处理的流程。

在详述之前,先来个图来描述一下上面的内容:

这里边主要的问题在于,ROS图像与opencv图像之间的互相转换。主要涉及到ROS的功能包cv_bridge。这里主要讲讲C++版本的,python版本的原理和C++的一样。

(和官方文档说得差不多,英文好的可以直接看原文

http://wiki.ros.org/cv_bridge/Tutorials/UsingCvBridgeToConvertBetweenROSImagesAndOpenCVImages

首先来理解一些概念,ROS用sensor_msgs/Image消息格式来传输图像,这个和opencv图像格式不同,这样就需要有一个图像转换的过程。而CvBridge提供了ROS和opencv之间的接口。原理如图所示:

我们再来看看cv_bridge命名空间:

里面的cv::Mat变量即为OpenCV格式图像。也就是我们要把ROS的图像sensor_msgs::Image图像类型转换为cv_bridge图像类型,然后抽取cv_bridge的image变量即为opencv的图像类型数据。

图像的转换,可以使用以下的其中一个函数(根据自己的需求选取,具体使用方式请参阅官方文献)

图像格式转换过来之后,剩下的就是OpenCV图像处理的事情了。图像处理请参阅OpenCV官网的资料和例程。

 

下来就举一个人脸检测的例子来对上面的内容进行一个实例化的补充说明。

1、 打开终端运行如下两条命令:(启动ROS环境)

2、 usb_cam设备驱动节点跟《ROS中usb摄像头的使用_(usb_cam)》的一样,直接运行即可,运行之后,图像会不断地发布到/camera/image_raw主题上:

3、 图像显示和图像处理节点cvbridge,框架跟《ROS中usb摄像头的使用_(usb_cam)》的一样,只是在里面稍微做些修改即可,这里吧它的源码全部贴出来,里面带了注释,这里我就不多说了。编译之后,可以用以下命令直接运行

编译过程:

编译成功之后,可执行文件节点生成于 “~/catkin_ws_cvbridge/devel/lib/cvbridge”文件夹中

至此,图像接收和显示节点已经构建完成。

在运行程序前,要确保连个模型文件的存在和存放位置:

haarcascade_frontalface_alt.xml 和 haarcascade_eye_tree_eyeglasses.xml

可以到opencv源码目录里去下载:

https://github.com/Itseez/opencv/tree/master/data/haarcascades

保存位置,就看你代码怎么写了,如果是绝对路径或者相对路径,就把它们放在对应的路径里边,如果是运行环境路径,就把它们放在指令运行的当前目录里边,比如下面的情况,我是在catkin_ws_cvbridge文件夹里运行rosrun命令的,那我就得把这两个文件放在catkin_ws_cvbridge文件夹里边。

运行以下两个命令来执行节点:(图像接收显示并对图像进行处理)

具体代码如下:

成功运行之后,显示如下:(摄像头图像不是很流畅)

参考文献:

1、Converting between ROS images and OpenCV images (C++)

链接地址为:

http://wiki.ros.org/cv_bridge/Tutorials/UsingCvBridgeToConvertBetweenROSImagesAndOpenCVImages

2、《OpenCV源码》

链接地址为:

https://github.com/Itseez/opencv

3、Cascade Classifier:OpenCV人脸检测例程》

链接地址为:

http://docs.opencv.org/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html?highlight=haarcascade_frontalface_alt

 

 

 

Jason.Que 于 小芽科技

2015年10月11

ROS中usb摄像头的使用_(usb_cam)

环境: Ubuntu12.04 ROS Hydro version   特别标注: 这篇文章首发于“北京小芽科技有限公司”的技术博客(xiaoyatec.com)上...

阅读全文

欢迎留言

你必须启用JavaScript才能看到这里的验证码!