前言

本文目的在于求解出摄像机的各个内外参数,以及分析照片数量、拍摄角度等因素对求解过程所产生的影响。

一、原理简介

1.摄像机的位置标定是什么?

摄像机位置标定,即求解摄像机的内外参数矩阵。

2.为什么要进行摄像机的位置标定?

摄像机的内、外参数矩阵描述了三维世界到二维像素的映射关系。因此摄像机的位置标定十分关键,只有当我们知道了三维与二维的对应关系,才有可能进行二维到三维的转变。

3.针孔相机模型

摄像机坐标系到像素坐标系的转换:对于相机坐标系下的点(x,y,z),我们先根据三角形相似的性质,将其转换为图像坐标系下的点。由于图像坐标系与像素坐标系的原点以及坐标系下的单位不一致,因此图像坐标系下的点存在平移以及单位换算才能转换成像素坐标系下的点。具体公式如下所示,其中 f 为焦距,Cx,Cy为偏置量,k,l 为单位换算系数。

摄像机 坐标计算 python_线性代数

接下来我们令fk=α,fl=β得:

摄像机 坐标计算 python_矩阵_02

然后将其转换到齐次坐标下,并使用矩阵形式表述:

摄像机 坐标计算 python_矩阵_03

又由于摄像机制造工艺因素影响,我们的像素坐标系xy轴可能不是垂直的,c存在θ夹角,因此我们需要将角度加进去,具体公式为:

摄像机 坐标计算 python_矩阵_04

如上述公式所示,我们令P’=MP=K[I 0]P,其中M为投影矩阵,K为内参数矩阵。   
                              

摄像机 坐标计算 python_线性代数_05

                               

摄像机 坐标计算 python_矩阵_06

世界坐标系到像素坐标系的转换:我们得出摄像机坐标系到像素坐标系的转换关系后,只需要再知道世界坐标系到摄像机坐标系的转换关系,便可以进一步推导出世界坐标系到像素坐标系的转换关系,其具体流程如下所示。

为了方便展示,先给出坐标系的关系图。

摄像机 坐标计算 python_线性代数_07

摄像机 坐标计算 python_线性代数_08

由于世界坐标系到摄像机坐标系存在平移与旋转关系,因此两坐标之间的关系可写为: 

                                 

摄像机 坐标计算 python_摄像机 坐标计算 python_09

其中Pw为世界坐标系下的坐标,R为选装矩阵,T为移位矩阵。
有了上述关系后,接下来我们便可以进一步推导出世界坐标系与像素坐标系之间的关系,并引出内外参数。

注:上述方法坐标均为齐次坐标,且不考虑畸变。 

4.张正友标定法

张正友标定法利用如下图所示的棋盘格标定板,在得到一张标定板的图像之后,可以利用相应的图像检测算法得到每一个角点的像素坐标(u,v)。

张正友标定法将世界坐标系固定于棋盘格上,则棋盘格上任一点的物理坐标 Z=0,由于标定板的世界坐标系是人为事先定义好的,标定板上每一个格子的大小是已知的,我们可以计算得到每一个角点在世界坐标系下的物理坐标(X,Y,Z=0)。

假设我们提供K个棋盘图像,每个棋盘有N个角点,于是我们拥有2KN个约束方程。与此同时,忽略畸变的情况下,我们就需要求解4个内参和6K个外参(内参只于相机内部参数有关,外参却随目标点位置变化而变化),也就是说,只有当2KN>=4+6K的时候,也即K(N-3)>=2时,才能求出内外参矩阵。同时,无论在一张棋盘上检测到多少角点,由于棋盘上角点的规则布置使得真正能利用上的角点只有4个(在四个方向上可延展成不同的矩形),于是有当N=4时,K(4-3)>=2,即K>=2,也就是说,我们至少需要两张棋盘在不同方位的图像才能求解出无畸变条件下的内参和外参。

实际上我们往往会在一张棋盘上布置更多的角点,因为这样就可以通过最小二乘法求得最优解了,同样地,我们会需要至少10张以上的棋盘图像,目的是考虑数值稳定性和提高信噪比,得到更高质量的结果。

方法:

1.模型

在无畸变的情况下我们将成像模型定义为:

摄像机 坐标计算 python_世界坐标系_10

其中,R1 , R2为外参矩阵R的前两列。为了简便,将内参矩阵记为A 。对于不同的图片,内参矩阵A为定值;对于同一张图片,外参矩阵( R1 ,R2, T ) 为定值;对于同一张图片上的单点,内参矩阵A ,外参矩阵( R1 ,R2, T ),尺度因子Z为定值。我们将A ( R1,R2, T )设为H,其表达如下:

摄像机 坐标计算 python_矩阵_11

2.求解内参数 

已知R1,R2为旋转矩阵前两列,因此必然满足以下关系:

摄像机 坐标计算 python_线性代数_12

摄像机 坐标计算 python_线性代数_13

因此可以得到如下关系:

摄像机 坐标计算 python_矩阵_14

再令:

摄像机 坐标计算 python_世界坐标系_15

其中B为对称矩阵。因此下面我们就是要求解出B矩阵,我们先对如下式子进行变形:

摄像机 坐标计算 python_计算机视觉_16

摄像机 坐标计算 python_世界坐标系_17

则上述方程可化简为:

摄像机 坐标计算 python_摄像机 坐标计算 python_18

 又因为

摄像机 坐标计算 python_线性代数_19

 故

摄像机 坐标计算 python_线性代数_20

由于矩阵H 已知,矩阵v又全部由矩阵H的元素构成,因此矩阵v已知。然后再根据矩阵B与相机内参数的对应关系可得: 

摄像机 坐标计算 python_矩阵_21

                        

摄像机 坐标计算 python_计算机视觉_22

摄像机 坐标计算 python_摄像机 坐标计算 python_23

                

摄像机 坐标计算 python_计算机视觉_24

摄像机 坐标计算 python_世界坐标系_25

3.求解外参数矩阵

 由于A已知,H已知,再根据( R1 ,R2, T ),A以及H对应关系即可求出( R1 ,R2, T )。

4.标定相机的畸变参数

径向畸变公式(2阶)如下:

摄像机 坐标计算 python_线性代数_26

其中

摄像机 坐标计算 python_矩阵_27

 

 接下来我们可得到畸变后的像素坐标表达式为:

摄像机 坐标计算 python_摄像机 坐标计算 python_28

                                

摄像机 坐标计算 python_矩阵_29

然后将其代入径向畸变公式(2阶)则有:

摄像机 坐标计算 python_摄像机 坐标计算 python_30

再化简得:

摄像机 坐标计算 python_世界坐标系_31

摄像机 坐标计算 python_线性代数_32

 将约束方程系数矩阵记为D ,等式右端非齐次项记为d,其矩阵形式为:

摄像机 坐标计算 python_线性代数_33

最后利用最小二乘法求解:

摄像机 坐标计算 python_线性代数_34

二、实验分析

8张图片,变换角度拍摄

摄像机 坐标计算 python_矩阵_35

12张图片变换角度拍摄

摄像机 坐标计算 python_矩阵_36

14张图片变换角度拍摄

摄像机 坐标计算 python_矩阵_37

从观察结果可以发现,其错误率程现下降趋势,这是因为在特征匹配时可能会出现匹配错误的点对,还有就是如果照片较少,那么匹配点数会很少,那么做极大似然估计进行优化的效果就不是很好。下述为u极大似然优化的公式,其中n为图片数量,m为匹配点对的数量,不难看出mn影响了极大似然估计的效果。

摄像机 坐标计算 python_世界坐标系_38

14张图片不变换角度拍摄

 

摄像机 坐标计算 python_计算机视觉_39

可以发现其误差明显降低,这是因为外参矩阵反映的是标定板和相机的位置关系。对于不同的图片,标定板和相机的位置关系已经改变,此时每一张图片对应的外参矩阵都是不同的。来的误差会而对于在同一位置拍摄的图片来说,其外参矩阵理想情况下是不会改变的因此多张图片求解同一个外参矩阵对应的精确度当然会更高一些。