ROS中有这样一组功能包名为image_pipeline的基础功能包,我敢肯定做视觉的小伙伴都或多或少的使用到了其中的一些功能,但是可能并不会注意到这个包的一些其他的强大之处,今天就让我来带大家具体了解一下吧。

本文参考来源为http://wiki.ros.org/image_pipeline?distro=melodic

1、整体介绍

image_pipeline功能包是用于将图像信息流从相机驱动转换到ROS话题的一个基础设施,可以生成校正后的灰度/彩色图片、双目图像以及双目点云,包含以下组件:

  • 标定Calibration:提供工具用于标定单目或双目相机。
  • 单目处理Monocular processing:可根据标定参数修改原始图像畸变。
  • 双目处理Stereo processing:可根据参数校正图片畸变,并可生成深度差异图像和点云。
  • 深度处理Depth processing:为深度图像提供处理,如生成点云。
  • 可视化Visualization:为直接查看图像话题提供工具,也支持查看双目图像及对应的深度差异图像。

2、标定包camera_calibration

camera_calibration包中提供了对单目相机、双目相机、鱼眼相机(melodic版本及之后)的标定支持。

单目标定步骤如下:

1.启动节点

rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.108 image:=/camera/image_raw camera:=/camera

其中,size 8*6表示棋盘格角点数,square表示每个棋盘格的长度(单位m),image表示相机原始图像数据话题,后面的camera表示相机frame名称。以上信息需要根据具体情况配置。

2.移动标定板
为了得到一个好的标定结果,应该使得标定板尽量出现在摄像头视野的各个位置里:如标定板出现在视野中的左边,右边,上边和下边,标定板既有倾斜的,也有水平的,也有覆盖整个镜头视野的。

移动标定板直到calibrate按钮亮显,即可点击该按钮进行计算。需要注意计算需要一段时间,需要等待一下。

3.保存
在计算完成后,可以看到如下的窗口中显示校正后的结果

如果校正成功可以看到标定板的线比较直的。
另外窗口上方的scale滑动条可以用来调整裁剪比例。
scale为0.0则所有校正后的图片中的像素都是有效的,scale为1表示原图像数据流的信息都被保留,但是在旁边会存在无意义的黑边,就像这样:

如果对标定结果满意,就可以点击commit按钮,将相应的标定信息保存,保存路径会在控制台窗口中提供。

双目标定步骤如下:

双目标定步骤与单目基本一致,只在第一步的启动节点命令上有区别。
启动节点命令:

rosrun camera_calibration cameracalibrator.py --approximate 0.1 --size 8x6 --square 0.108 right:=/my_stereo/right/image_raw left:=/my_stereo/left/image_raw right_camera:=/my_stereo/right left_camera:=/my_stereo/left

需要注意修改两个相机的话题和frame。
标定后效果如下:

有关于标定的更多信息请参考官方文档。
单目标定
双目标定

3、单目处理包image_proc

该包负责根据标定的结果参数对图像进行校正,流程如图:

即根据接收的原始图像(topic:image_raw)及图像校正参数(topic:camera_info)发布共四个图像话题:
image_mono(sensor_msgs/Image): 黑白的未校正图像。
image_rect(sensor_msgs/Image): 黑白的校正图像。
image_color(sensor_msgs/Image): 彩色的未校正图像。
image_rect_color(sensor_msgs/Image): 彩色的校正图像。
举个例子,如果相机发布的原始话题my_camera/image_raw和my_camera/camera_info,可通过以下命令调用:

 ROS_NAMESPACE=my_camera rosrun image_proc image_proc

ROS_NAMESPACE为命名空间前缀,即此命令接收和发布的话题都在 my_camera/下。

4、双目处理包stereo_image_proc

该包根据双目原始图像及校正参数话题重新发布双目图像,流程如图:

如图所示,该包除了会发布左右镜头中处理后的图像,也会发布三个关于三维数据的话题:
disparity(stereo_msgs/DisparityImage) :浮点差异图像元数据。
points2 (sensor_msgs/PointCloud2):点云数据。
points(sensor_msgs/PointCloud):点云数据(废弃格式,尽量不要使用)。
点云数据的坐标系是基于左侧镜头的,如图:

调用方式与单目类似:

ROS_NAMESPACE=my_camera rosrun stereo_image_proc stereo_image_proc

disparity差异图像效果如图:

5、深度图像处理包depth_image_proc

提供了一些深度图像的常用处理,需要注意的是此包有一些功能都是通过nodelet调用的。
节点depth_image_proc/point_cloud_xyz:将深度图像转换为三维点云,并根据z值着色。

节点depth_image_proc/point_cloud_xyzrgb:将深度图像与彩色图像结合,生成点云。

节点epth_image_proc/register:基于彩色、深度图像信息以及深度图像,将深度图像转换到彩色图像坐标系下显示。

nodelet插件如果想要单独调用需要先启动nodelet节点,例如如果想要启动depth_image_proc/point_cloud_xyz可以按照如下方式写一个launch启动文件:

<launch>
  <node pkg="nodelet" type="nodelet" name="nodelet_manager" args="manager" />

  <node pkg="nodelet" type="nodelet" name="nodelet1"
        args="load depth_image_proc/point_cloud_xyz nodelet_manager">
    <remap from="camera_info" to="/camera/depth/camera_info"/>
    <remap from="image_rect" to="/camera/depth/image_rect_raw"/>
    <remap from="points" to="/camera/depth/points"/>
  </node>
</launch>

6、可视化image_view

这个命令就是可视化的去查看图像话题。直接上命令:

#查看单目图像(即查看话题/camera/image)
rosrun image_view image_view image:=/camera/image
#同时查看双目图像(即查看话题/my_stereo_cam/left/image_rect_color和/my_stereo_cam/right/image_rect_color)
rosrun image_view stereo_view stereo:=/my_stereo_cam image:=image_rect_color

另外有一点需要注意的是,如果想要查看压缩后的图像流(通常用于网络传输后),可以在调用节点时指定图像传输类型。
例如,如果发布端使用了theora图像格式发布图像(通过theora_image_transport包),那么你就可以在显示时这样来执行:

rosrun image_view image_view image:=/camera/image theora

或者:

rosrun image_view image_view image:=/camera/image _image_transport:=theora

另外,还有一些使用的工具命令可以供我们使用:

image_saver:图像保存

单次保存一张:

rosrun image_view image_saver image:=[your topic]

按照时间保存:

终端1:
rosrun image_view image_saver image:=image_raw _save_all_image:=false _filename_format:=foo.jpg __name:=image_saver
终端2:
rosservice call /image_saver/save

注:查看图像的另一个方式是rqt_image_view命令,可以自由切换要查看的话题,并保存图像。

video_recorder:视频录制
rosrun image_view video_recorder images:=[your_topic] filename:=[outputvideo,default:output.avi] fps:=[your_fps,default = 15]

7、 图像发布

可以模拟发布一个稳定的固定的图像话题。

rosrun image_publisher image_publisher /opt/ros/indigo/share/rviz/images/splash.png

也可以为其指定坐标、相机参数等信息:

<launch>                                                                        
  <node pkg="nodelet" type="nodelet" name="manager" args="manager"/>

  <node pkg="nodelet" type="nodelet" name="image_publisher"
        args="load image_publisher/image_publisher manager">
    <param name="filename" value="$(find rviz)/images/splash.png" />
    <param name="flip_horizontal" value="false" />
    <param name="flip_vertical" value="false" />
  </node>
  <param name="/manager/frame_id" value="my_camera" />
  <param name="/manager/publish_rate" value="1" />
  <param name="camera_info_url" value="file:///$(env HOME)/.ros/camera_info/camera.yaml" />  <!-- relative to ~/.ros/ -->
</launch>