1. 缘由意义
在图像测量过程以及机器视觉应用中
为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型
这些几何模型参数就是相机参数
无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节
其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性
因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在
2. 目的
求出相机的内、外参数,以及畸变参数
3. 标定
3.1. 准备
以Ubuntu20环境为例,ROS版本为noetic
先使用以下命令安装摄像头标定功能包camera_calibration
及其相关工具:
$ sudo apt install ros-noetic-usb-cam ros-noetic-camera-calibration ros-noetic-image-view ros-noetic-image-proc
硬件方面除了摄像头,还需要如图所示棋盘格图案的标定靶
可以打印出来或在电脑屏幕显示
3.2. 启动摄像头
首先使用以下命令启动usb摄像头
roslaunch usb_cam usb_cam-test.launch
启动时会出现警告
因为相机启动时自动检查矫正文件,而现在还没有
这个就是我们需要求的文件,目前缺失没关系
如果使用的是Realsense相机,则需要修改usb_cam-test.launch文件中video_device的值,默认/dev/video0
我这边没有前置摄像头,所以一般RGB图像是在/dev/video4,通过修改一下就好了
修改usb_cam-test.launch的方法:1.先进入功能包$ roscd usb_cam ; 2.再进入launch文件夹:$ cd launch;3.编辑文件:sudo gedit usb_cam-test.launch
现在工具齐全,可以开始标定了
3.3. 启动标定程序
新建窗口使用以下命令启动标定程序,需要加载将被校准的图像主题:
rosrun camera_calibration cameracalibrator.py ––size 8x6 ––square 0.025 image:=/usb_cam/image_raw camera:=/usb_cam
Cameracalibrator.py
标定程序需要以下几个输入参数:
- Size:标定靶的内部角点个数,这里使用的棋盘格一共六行,每行有八个内部角点
- Square:这个参数对应每个棋盘格的边长,单位是米(根据实际情况调整)
- Image和camera:设置摄像头发布的图像话题
根据使用的摄像头和标定靶尺寸相应修改以上参数,即可
3.4. 开始标定
在没有标定成功前,右边的按钮都为灰色,不能点击
将标定靶放在摄像头视野内,应该可以看到以下图形界面
为了提高标定的准确性
应该尽量让标定把出现在摄像头视野范围内的各个区域,界面右上角的进度条会提示标定进度
- X:标定靶在摄像头视野中的左右移动
- Y:标定靶在摄像头视野中的上下移动
- Size:标定靶在摄像头视野中的前后移动
- Skew:标定靶在摄像头视野中的倾斜转动
不断在视野中移动标定配,直到CALIBRATE
按钮变色,表示标定程序的参数采集完成
最好保证所有的进度条都是绿色满格的
点击CALBRATE
按钮
标定程序开始自动计算摄像头的标定参数,并显示:
**** Calibrating ****
mono pinhole calibration...
这个过程满要等待段时间(几分钟), 界面可能会变成灰色无响应状态,期间不要关闭
参数计算完成后界面回复,而且终端也会有标定结果的显示
[image]
width
640
height
480
[narrow_stereo]
camera matrix
615.057435 0.000000 333.735616
0.000000 615.163616 263.417049
0.000000 0.000000 1.000000
distortion
0.261680 -0.651886 0.000347 -0.014690 0.000000
rectification
1.000000 0.000000 0.000000
0.000000 1.000000 0.000000
0.000000 0.000000 1.000000
projection
629.375916 0.000000 326.497955 0.000000
0.000000 634.527771 263.175221 0.000000
0.000000 0.000000 1.000000 0.000000
当前显示的图片为校准过后的
可以通过调整下方scale滑条调整
刻度为0.0意味着图像的大小,以便校正图像中的所有像素都是有效的
校正后的图像没有边框,但原始图像中的一些像素被丢弃
刻度为1.0意味着原始图像中的所有像素都是可见的
但是校正后的图像有黑色边框,在原始图像中没有输入像素
3.5. 数据保存
点击save
按钮,终端会打印生成文件及路径(计算机目录/tmp下)
在计算机目录打开/tmp
文件夹,可以看到calibrationdata.tar.gz
解压文件后从中找到ost.yaml
文件
点击commit
按钮,提交数据并退出程序
可以看到提示写入文件head_camera.yaml
writing calibration data to /home/jove20/.ros/camera_info/head_camera.yaml
也就是开始欠缺的,现在重新启动摄像头的话就无上述警告了
查看文件内容也就是之前保存的ost.yaml
文件,只不过文件里面的参数camera_name
改为head_camera
3.6. 纠正
简单地加载校准文件并不能纠正图像
要进行更正,可以使用Image_proc
包
摄像头节点运行的情况下进行视觉处理:
$ ROS_NAMESPACE=usb_cam rosrun image_proc image_proc
下图为严重畸变摄像头拍摄:
订阅image_rect_color
图像,很明显的可以看到与原图像的对比
谢谢