摘要:本文首先介绍了针孔相机模型(线性模型),然后推导四个坐标轴变换的关系,引出R、T、K、D中包含相机的5个内参,6个外参。然后介绍相机畸变的原因以及畸变模型(非线性模型),引出相机的5个畸变参数。相机的标定是从空间点及其对应的像素点,获得相机的位置信息和内部参数信息的过程,16个相机参数的总结为此提供了模型基础。最后通过这16个参数建立的模型对失真的图片进行矫正。

1 相机线性模型

摄像机的线性模型是在理想情况下的成像模型,即光学中的中心投影,我们通常也称为针孔模型

1.1 针孔相机模型

在介绍摄像机标定参数之前,需要先简单说一下针孔摄像机的原理。投影平面到小孔的距离为焦距f,物体到小孔的距离为Z,其中物体和投影是倒立相似的关系,下图为针孔摄像机的投影示意 。

相机畸形矫正 Python 相机畸变校正_线性模型

如果按照实际的投影关系建立坐标系,那么投影坐标和物体坐标的符号总是相反的,考虑起来不太方便,于是在“数学上”把投影平面平移到其关于小孔对称的位置,这样投影坐标和物体坐标符号就相同了,示意图如下:

相机畸形矫正 Python 相机畸变校正_线性模型_02

根据三角形相似的原理,可以列出如下等式:

相机畸形矫正 Python 相机畸变校正_线性模型_03

1.2 相机中的坐标系

在视觉测量中,需要进行的一个重要预备工作是定义四个坐标系的意义,即世界坐标系摄像机坐标系 、 图像坐标系像素坐标系  。

相机畸形矫正 Python 相机畸变校正_相机畸形矫正 Python_04

  • {world},{camera},{picture}和{pixel}坐标系的坐标用下标来区分,分别是W,c,p,pix
  • {world},{camera},{picture}坐标系单位为长度,一般为mm;{pixel}坐标系单位为像素,一般为pix
  • {world}坐标系为世界坐标系,可以任意指定,其他坐标系都有明确的定义
  • {camera}坐标系为摄像机坐标系,原点在小孔的位置,z轴与光轴重合,Xc轴和Yc轴分别和投影面两边平行
  • {picture}坐标系为图像坐标系,光轴和投影面的交点为原点,Xp轴和Yp轴分别和投影面两边平行
  • {pixel}坐标系为像素坐标系,从小孔向投影面方向看,投影面的左上角为原点Opix,uv轴和投影面两边重合

1.3 各个坐标系的坐标转换

1.3.1 {world}到{camera}

设某点在{world}坐标系中的坐标为

相机畸形矫正 Python 相机畸变校正_相机标定_05

,该点在{camera}坐标系中的坐标为

相机畸形矫正 Python 相机畸变校正_OpenCV_06

,则有                                                                                        

相机畸形矫正 Python 相机畸变校正_OpenCV_07

                                        

其中R是正交旋转矩阵:

                                                                                   

相机畸形矫正 Python 相机畸变校正_相机畸形矫正 Python_08

                                          

T是平移矩阵:

                                                                                     

相机畸形矫正 Python 相机畸变校正_线性模型_09

                                               

确定R需要3个参数,确定T需要3个参数,共需6个参数,这6个参数称为摄像机的外部参数。(在单目相机中外参没有多少意义。只有在双目相机中,以另一个摄像头为坐标系,得出的相对另一个摄像头的旋转和平移矩阵才有实际意义)

1.3.2 {camera}到{picture}

设空间点

相机畸形矫正 Python 相机畸变校正_畸变矫正_10

在{camera}下:

相机畸形矫正 Python 相机畸变校正_相机标定_11

,其像点

相机畸形矫正 Python 相机畸变校正_线性模型_12

在{picture}的齐次坐标为

相机畸形矫正 Python 相机畸变校正_相机畸形矫正 Python_13

,由图中相似三角形可得,                                                                                       

相机畸形矫正 Python 相机畸变校正_OpenCV_14

                                                 

写成矩阵表示为,

                                                                            

相机畸形矫正 Python 相机畸变校正_线性模型_15

                                           

1.3.3 {picture}到{pixel}


相机畸形矫正 Python 相机畸变校正_线性模型_16

表示Xpix方向上单位mm的像素数,单位是pix/mm,

相机畸形矫正 Python 相机畸变校正_相机标定_17

表示Ypix方向上单位mm的像素数,单位是pix/mm,

相机畸形矫正 Python 相机畸变校正_线性模型_18


相机畸形矫正 Python 相机畸变校正_畸变矫正_19

表示投影平面中心在{pixel}中的坐标,设像素坐标

相机畸形矫正 Python 相机畸变校正_相机标定_20

相机畸形矫正 Python 相机畸变校正_畸变矫正_21

,则有                                                                             

相机畸形矫正 Python 相机畸变校正_线性模型_22

                                           

写成矩阵形式

                                               

相机畸形矫正 Python 相机畸变校正_相机畸形矫正 Python_23

               

结合{picture}到{image}的变换,则{camera}到{pixel}的变换矩阵K为

                                                      

相机畸形矫正 Python 相机畸变校正_畸变矫正_24

                       其中,

相机畸形矫正 Python 相机畸变校正_畸变矫正_25


相机畸形矫正 Python 相机畸变校正_OpenCV_26

称为相机在u轴和v轴方向上的尺度因子。

小结:

相机畸形矫正 Python 相机畸变校正_OpenCV_27

相机畸形矫正 Python 相机畸变校正_相机标定_28

相机畸形矫正 Python 相机畸变校正_线性模型_18

相机畸形矫正 Python 相机畸变校正_畸变矫正_19

这4个数叫做

摄像机的内部参数

,有时把焦距

相机畸形矫正 Python 相机畸变校正_OpenCV_31

也当作内部参数。因为这些参数只和摄像机有关系,和具体的摄像场景,和世界坐标系没有关系.

相机畸形矫正 Python 相机畸变校正_OpenCV_27

相机畸形矫正 Python 相机畸变校正_相机标定_28

的物理意义是摄像头感光芯片像素点的长宽比例,

相机畸形矫正 Python 相机畸变校正_线性模型_18

相机畸形矫正 Python 相机畸变校正_畸变矫正_19

的物理意义是摄像头感光芯片安装时与理论中心的水平与垂直偏移量。

1.3.4 {world}到{pixel}

综上,可得:

                                                                      

相机畸形矫正 Python 相机畸变校正_OpenCV_36

                                 

2 相机畸变模型

透镜由于制造精度以及组装工艺的偏差会引入畸变,导致原始图像的失真。镜头的畸变分为径向畸变和切向畸变两类。径向畸变来自于透镜形状,切向畸变来自于整个摄像机的组装过程。畸变还有其他类型的畸变,但是没有径向畸变、切向畸变显著。


相机畸形矫正 Python 相机畸变校正_畸变矫正_37

畸变图示

2.1 径向畸变

顾名思义,径向畸变就是沿着透镜半径方向分布的畸变,产生原因是光线在原理透镜中心的地方比靠近中心的地方更加弯曲,这种畸变在普通廉价的镜头中表现更加明显,径向畸变主要包括桶形畸变和枕形畸变两种。以下分别是枕形和桶形畸变示意图:

相机畸形矫正 Python 相机畸变校正_相机畸形矫正 Python_38

成像仪光轴中心的畸变为0,沿着镜头半径方向向边缘移动,畸变越来越严重。畸变的数学模型可以用主点(principle point)周围的泰勒级数展开式的前几项进行描述,通常使用前两项,即k1和k2,对于畸变很大的镜头,如鱼眼镜头,可以增加使用第三项k3来进行描述,成像仪上某点根据其在径向方向上的分布位置,调节公式为:
                                           

                                                              

相机畸形矫正 Python 相机畸变校正_相机标定_39

公式里(

相机畸形矫正 Python 相机畸变校正_线性模型_18


相机畸形矫正 Python 相机畸变校正_畸变矫正_19

)是畸变点在成像仪上的原始位置,(

相机畸形矫正 Python 相机畸变校正_线性模型_42


相机畸形矫正 Python 相机畸变校正_相机标定_43

)是产生畸变后新的位置,下图是距离光心不同距离上的点经过透镜径向畸变后点位的偏移示意图,可以看到,距离光心越远,径向位移越大,表示畸变也越大,在光心附近,几乎没有偏移。

相机畸形矫正 Python 相机畸变校正_畸变矫正_44

2.2 切向畸变

切向畸变是由于透镜本身与相机传感器平面(成像平面)或图像平面不平行而产生的,这种情况多是由于透镜被粘贴到镜头模组上的安装偏差导致。畸变模型可以用两个额外的参数p1和p2来描述:

                                                              

相机畸形矫正 Python 相机畸变校正_OpenCV_45

下图显示某个透镜的切向畸变示意图,大体上畸变位移相对于左下——右上角的连线是对称的,说明该镜头在垂直于该方向上有一个旋转角度。

相机畸形矫正 Python 相机畸变校正_相机畸形矫正 Python_46

小结:单目摄像机透镜畸变校正需要确定的就是k1,k2,k3,p1,p2这5个参数,如果“鱼眼”现象不明显的话,常常使用k1,k2来校正径向畸变。

3,相机畸变矫正

大致流程如下,有待进一步完善

  1. 准备标定图片
  2. 对每一张标定图片,提取角点信息
  3. 对每一张标定图片,进一步提取亚像素角点信息
  4. 在棋盘标定图上绘制找到的内角点(非必须,仅为了显示)
  5. 相机标定
  6. 对标定结果进行评价
  7.  查看标定效果——利用标定结果对棋盘图进行矫正