机器视觉(一)——ROS中的图像数据

机器视觉(一)——ROS中的图像数据

总述

无论是USB摄像头还是RGBD摄像头,发布的图像数据格式多种多样,在处理这些数据之前。就需要了解这些数据的格式。

一、二维图像数据

连接USB摄像头到PC端的USB接口,通过以下命令启动摄像头:

roslaunch usb_cam usb_cam-test.launch

启动成功后,使用以下命令查看当前系统中的图像话题信息:

rostopic info /usb_cam/image_raw

从打印的信息中可以看到,图像话题的消息类型是sensor_msgs/Image,这是ROS定义的一种摄像头原始图像的消息类型,可以使用以下命令查看该图像消息的详细定义:

rosmsg show sensor_msgs/Image

该类型图像数据的具体内容如下:
1)hyizheneader:消息头,包含图像的序号、时间戳和绑定坐标系。
2)height:图像的纵向分辨率,即图像包含多少行的像素点,这里使用的摄像头为720.
3)width:图像的横向分辨率,即图像包含多少列的像素点,这里使用的摄像头为1280.
4)encoding:图像的编码格式,包含RGB、YUV等常用格式,不涉及图像压缩编码。
5)is_bigendian:图像数据的大小端存储模式。
6)step:一行图像数据的字节数量,作为数据的步长参数,这里使用的摄像头为width X 3 = 1280 X 3 = 3840字节。
7)data:存储图像数据的数组,大小为step X height字节,根据该公式可以算出这里使用的摄像头产生一帧图像的数据大小是3840 X 720 = 2764800字节,即2.7648MB。
一帧720X1280分辨率的图像数据量就是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 x height
8)is_dense:是否有无效点。
点云数据中每个像素点的三维坐标都是浮点数,而且包含图像数据,所以单帧数据量也很大。如果使用分布式网络传输,在带宽有限的前提下,需要考虑能否满足数据的传输要求,或者针对数据进行压缩。

猜你喜欢

转载自blog.csdn.net/weixin_45661757/article/details/113255999