上一篇介绍了相机模型和畸变模型,有了这个基础就可以对相机标定进行讲解了。
张正友标定法,其实就是拍摄10几张不同姿态的棋盘格,就可以估算出相机的内参和棋盘格的姿态。利用针孔相机模型,计算棋盘格三维平面的世界坐标与棋盘格图像的坐标之间的透视关系(单应性)。
具体推导过程:
有2D点m 和 3D点M
对应的齐次坐标分别是
根据针孔相机模型,世界坐标系到像素坐标之间的关系:
A 就是相机的内参矩阵:
其中a,b分别表示x,y方向的焦距, u0 , v0 表示光心坐标, γ表示x方向和y方向之间的倾斜系数,一般来说默认等于0.
我们把R用3个列向量的表示,并令Z=0
进一步简化
H 就是单应性矩阵。
根据R的性质可以设置两个约束条件, r1, r2 是单位正交的向量,存在以下性质:
把H矩阵也写成3个列向量的形式,那么约束条件就可以写成
展开
可以看出这两个等式是关于下式的方程:
两个平面之间的单应性矩阵H 可以利用DLT计算求得,那么计算出A来,然后就可以计算其他的参数。
B 是一个对称矩阵,有6个参数需要求解,一个棋盘格有两个方程,所以至少需要拍摄3张棋盘格图像。
令hi 表示H矩阵第i列的向量 , 那么
把方程组化简成Vb=0的形式
计算出B之后,就可以对B进行分解,求得相机内参A
求解出A矩阵之后,相机的外参就可以求解
以上都是通过求解方程组,得到的初值,而做相机标定,往往需要拍摄10几张以上,那么求解的结果就不够准确,所以需要对初值进行迭代优化。
构建最大似然估计,使得目标函数求和最小
如果把畸变系数也考虑进去
一般来说,畸变系数的求解都是放在优化函数迭代求解的,初值可以设置为0。
好了原理就讲这么多,那么开始实现吧。
下一讲,重点用C++代码实现