- ROS中的图像数据。
- 摄像头标定。
- ROS+Opencv应用实例(人脸识别、物体跟踪)。
- 二维码识别。
- 扩展内容:物体识别与机器学习。
启动摄像头:没有安装的话参照下面命令安装一下:
sudo apt-get install ros-kinetic-usb-cam
安装完成之后就可以启动摄像头了:
roslaunch usb_cam usb_cam-test.launch
我们接下来看一下这个摄像头的驱动到底发布了哪些数据:
我们刚才的摄像头就是usb_cam/image_raw这个话题,我们接下来看一下它发布的消息的具体类型:
第一行是这个话题消息的类型,从第一行可以看到,是sensor_msg这样一个类型。那这样一种图像消息里面的成员变量有哪些呢?通过以下命令我们可以打印出这样的一个消息类型里面的具体成员变量。
里面的具体的成员变量的解释如下:
- Header:很多话题消息里面都包含的。里面有三个内容:消息头,包含消息序号,时间戳和绑定坐标系。消息的序号表示我们这个消息发布是排第几位的,并不需要我们手动去标定,每次发布消息的时候会自动地去累加; 绑定坐标系表示的是我们是针对哪一个坐标系去发布的。header有时候也不需要去配置。
- height:图像的纵向分辨率
- width:图像的横向分辨率
- encoding:图像的编码格式,包含RGB、YUV等常用格式,都是原始图像的编码格式,不涉及图像压缩编码;
- is_bigendian: 图像数据的大小端存储模式;
- step:一行图像数据的字节数量,作为数据的步长参数;
- data:存储图像数据的数组,大小为step×height个字节。
在ros里面提供了我们另外一种压缩图像的类型,
- format:图像的压缩编码格式(jpeg、png、bmp)。
- data:存储图像数据数组。
原教学视频里面还说了深度摄像头的相关知识,我这里没有深度摄像头,所以有需要的可以自己去看源视频,在我的github里面可以找到视频的相关信息。
摄像头标定
摄像头这种精密仪器对光学器件的要求较高,由于摄像头内部与外部的一些原因,生成的物体图像往往会发生畸变,为避免数据源造成的误差,需要针对摄像头的参数进行标定。
为了保证我们图像的质量,在采集图像之前,我们需要对摄像头做标定。
安装标定功能包:
sudo apt-get install ros-kinetic-camera-calibration
启动摄像头,robot_vision这个包在第五讲的源代码包里面有。
roslaunch robot_vision usb_cam.launch
启动成功之后没有摄像头的界面,因为包里面是没有去打开摄像头的:
启动标定包:
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.024 image:=/usb_cam/image_raw camera:=/usb_cam
以上程序就会启动我们标定功能包的一个标定程序。
然后我们打开在功能包里面的doc文件,就可以看到这样一个黑白相见的图片,然后我们做旋转等等操作,移动几遍,标定好了之后如下图所示:
标定成功之后会显示灰绿色的这个按钮颜色。之后我们再点击这个绿色的按钮,然后图形将该会卡住,在后台做一些计算,运行一会之后就能看到如下效果:
我们接着点击save按钮。之后在终端里面会告诉我们标定的数据存放在哪个路径下面:
到此,标定就已经结束了。
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.024 image:=/usb_cam/image_raw camera:=/usb_cam
- size:标定棋盘格的内部角点个数,这里使用的棋盘一共有六行,内部8个角点;
- square:这个参数对应每个棋盘的边长,单位是米;
- image和camera:设置摄像头发布的图像话题。
我们找到刚刚产生的文件,将其解压缩,如下图所示:
然后里面有用的文件是 ost.yaml。然后放入我们的功能包,并将其重命名就可以了: