无论是USB摄像头还是RGBD摄像头,发布的图像数据格式多种多样,在处理这些数据之前,我们首先需要了解这些数据的格式。
二维图像数据
连接USB摄像头到PC端的USB接口,通过以下命令启动摄像头:
roslaunch usb_cam usb_cam-test.launch
启动成功后,使用以下命令查看当前系统中的图像话题信息
rostopic info /usb_cam/image_raw
可以使用以下命令查看该图像消息的详细定义
rosmsg show sensor_msgs/Image
运行结果
该类型图像数据的具体内容如下。
1)header:消息头,包含图像的序号、时间戳和绑定坐标系。
2)height:图像的纵向分辨率,即图像包含多少行的像素点,这里使用的摄像头为720。
3)width:图像的横向分辨率,即图像包含多少列的像素点,这里使用的摄像头为1280。
4)encoding:图像的编码格式,包含RGB、YUV等常用格式,不涉及图像压缩编码。
5)is_bigendian:图像数据的大小端存储模式。
6)step:一行图像数据的字节数量,作为数据的步长参数,这里使用的摄像头为 width×3=1280×3=3840字节。
7)data:存储图像数据的数组,大小为step×height字节,根据该公式可以算出这里使用的摄像头产生一帧图像的数据大小是:3840×720=2764800字节,即2.7648MB。
一帧720×1280分辨率的图像数据量就是2.76MB,如果按照30帧/秒的帧率计算,那么一秒钟摄像头产生的数据量就高达82.944MB!这个数据量在实际应用中是接受不了的,尤其是在远程传输图像的场景中,图像占用的带宽过大,会对无线网络造成很大压力。实际应用中,图像
在传输前往往会进行压缩处理,ROS也设计了压缩图像的消息类型——sensor_msgs/CompressedImage
,该消息类型的定义如下图所示:
这个消息类型相比原始图像的定义要简洁不少,除了消息头外,只包含图像的压缩编码格式“format”和存储图像数据的“data”数组。图像压缩编码格式包含JPEG、PNG、BMP等,每种编码格式对数据的结构已经进行了详细定义,所以在消息类型的定义中省去了很多不必要的信息。
三维点云数据
在 Kinect数据显示中,rviz订阅camera/depth_registered/points话题后,主界面即可显示三维点云数据。
那么这种三维点云数据的消息类型是什么呢?可以使用如下命令查看
rostopic info /camera/depth_registered/points
该消息类型对应于rviz中Add可视化插件时所选择的插件类型,使用以下命令查看该消息类型的具体结构
rosmsg show sensor_msgs/PointCloud2
三维点云的消息定义如下:
1)height:点云图像的纵向分辨率,即图像包含多少行像素点。
2)width:点云图像的横向分辨率,即图像包含多少列像素点。
3)fields:每个点的数据类型。
4)is_bigendian:数据的大小端存储模式。
5)point_step:单点的数据字节步长。
6)row_step:一列数据的字节步长。
7)data:点云数据的存储数组,总字节大小为row_step×height。
8)is_dense:是否有无效点。
点云数据中每个像素点的三维坐标都是浮点数,而且包含图像数据,所以单帧数据量也很大。如果使用分布式网络传输,在带宽有限的前提下,需要考虑能否满足数据的传输要求,或者针对数据进行压缩。