Kinect_v1的相机标定这里我使用的是ROS中的标定工具,具体的参考可以参考ros.wiki官方资料。
1、连接相机
相机驱动在上一章中已经写了,过程其实很简单,安装两个ROS的资源包就可以了。
2、启动标定工具
启动标定包:
这个是启动相机的
roslaunch openni_launch openni.launch
这是是启动标定程序的:
rosrun camera_calibration cameracalibrator.py image:=/camera/rgb/image_raw camera:=/camera/rgb --size 5x4 --square 0.0245
注意这里的size是标定板的尺寸,但是好像可以任意设置,我用的标定板是10x10的,但是我用10x10很难完全检测到特征,最后用的5x4似乎也可以。最后一项是每个格子的边长,单位是米。启动后可以看到这样一个界面:
此时使用标定板在图像前方移动变换位置,会看到图像窗口的右上角有四个参数以及进度条:
等四个进度条都变成绿色的时候,点下面三个灰色中的第一个,这时候它应该是蓝色的。点这个之后过一会儿终端会提示生成了一些参数,这些其实就是相机的内参。
然后点三个灰色按钮中的第二个save,会提示出一条保存路径,该路径下保存了标定过程中采集的图片信息以及标定完成后的内参。
例如我这里的路径就是/tmp/calibrationdata.tar.ga,这是一个压缩包文件。
打开压缩包,里面有一个yaml文件,这里面放的就是最后的标定结果。文件如下:
image_width: 640
image_height: 480
camera_name: narrow_stereo
camera_matrix:
rows: 3
cols: 3
data: [527.676729, 0.000000, 318.030590, 0.000000, 527.481801, 261.715150, 0.000000, 0.000000, 1.000000]
distortion_model: plumb_bob
distortion_coefficients:
rows: 1
cols: 5
data: [0.159570, -0.266279, -0.001665, -0.005238, 0.000000]
rectification_matrix:
rows: 3
cols: 3
data: [1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000]
projection_matrix:
rows: 3
cols: 4
data: [539.786560, 0.000000, 315.015406, 0.000000, 0.000000, 541.949707, 261.172141, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000]
从中我们可以看到,文件的最上面是图像大小,这里我的相机是640*480的,下面是相机名称,感觉更加现实类型。
再往下是几个矩阵:
camera_matrix:
这个矩阵包含了相机的焦距以及中心坐标
也就是对应图片中等式右侧的第一个矩阵。
distorition_coefficients
畸变参数,畸变类型是上面distorition_model中的plumb_bob类型,这个跟传统的有一点点不一样,根据这其中的参考文献二:
虽然其中的字符定义和我们习惯性用的不太一致,但是二者含义是一样的。从上面图中可以看出,畸变参数中,第1,2,5个参数对应的是式(2.1)中的k1,k2,k3第3,4个参数对应的是式(2.1)中的 p1,p2因此我们可以知道:distortion_coefficients中的五个参数从前到后分别对应的是:k1,k2,p1,p2,k3。更详细的也可以参考这里的博文。
rectification_matrix
这个其实就是一个单位矩阵,用于去畸变。具体在ORB_SLAM2的去畸变部分中的代码中好像用的就是单位矩阵。
projection_matrix
为外部世界坐标到相平面的投影矩阵。