单目相机标定步骤
前置条件
- 已经安装完usb_cam包,Git链接
- 已经安装完camera_calibration包,安装了完整的ROS系统就有,可以通过下面的命令来检查:
rosdep install camera_calibration
如果输出All required rosdeps installed successfully就是成功的。
标定步骤
- 打印一张棋盘标定板,各种规格参数的都可以,点击官方链接下载。我下载的是
8x6的标定板(板内十字长宽上的点),square 0.0245 是标定板每个小格的尺寸(单位米)。
- 修改usb cam的launch文件,修改的地方是选择摄像头和设置标定后文件保存位置。文件默认的video_device是video0,也就是电脑自己的摄像头,改为video1就是外接摄像头,添加参数camera_info_url是设置标定后的保存位置,如果不设置会出现标定后无法保存的情况。
<launch>
<node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
<param name="video_device" value="/dev/video1" />
<param name="camera_info_url" value="package://usb_cam/camera_info/head_camera.yaml"/>
<param name="image_width" value="640" />
<param name="image_height" value="480" />
<param name="pixel_format" value="yuyv" />
<param name="camera_frame_id" value="usb_cam" />
<param name="io_method" value="mmap"/>
</node>
</launch>
- 开启roscore
- 打开相机
roslaunch usb_cam usb_cam-test.launch
- 打开矫正窗口,注意8x6是字母x,而不能用* 号,square后是每个小方格的尺寸,单位为米。
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.0245 image:=/usb_cam/image_raw camera:=/usb_cam
- 采集样本数据。
为了得到一个好的标定结果,应该使得标定板尽量出现在摄像头视野的各个位置里:标定板出现在视野中的左边,右边,上边和下边,标定板既有倾斜的,也有水平的,也要有离得近的、远的。
x:表示标定板在视野中的左右位置。
y:表示标定板在视野中的上下位置。
size:标定板在占视野的尺寸大小,也可以理解为标定板离摄像头的远近。 skew:标定板在视野上下左右中的倾斜位置。
- 计算矫正参数。
经过一番采集,当calibrate按钮亮起时,点击按钮,稍等几分钟,就可以在命令窗中看到标定参数,点击COMMIT将结果保存到电脑路径:/home/sun/.ros/camera_info/head_camera.yaml,再次启动相机时就不会有Camera Calibration文件找不到的警告了。只需加载校准文件不会纠正图像。 为了矫正图像,可以使用image_proc包。如果没有自动载入矫正文件,那么就需要调用下image_proc这个包。
两种解决方案:
1.在启动usb_cam的launch文件下面再加上
<node name="image_proc" pkg="image_proc" type="image_proc" ns="usb_cam"/>
2.启动usb_cam后,在终端命令窗口加上
ROS_NAMESPACE=usb_cam rosrun image_proc image_proc
参数意义
image_width、image_height代表图片的长宽
camera_name为摄像头名
camera_matrix规定了摄像头的内部参数矩阵
distortion_model指定了畸变模型
distortion_coefficients指定畸变模型的系数
rectification_matrix为矫正矩阵,一般为单位阵projection_matrix为外部世界坐标到像平面的投影矩阵