相机标定
相机标定内容
相机标定是计算机视觉中的一个重要问题,它的目的是确定相机的内部参数和外部参数,以建立从相机到图像的映射关系。相机标定的算法通常分为两个步骤:第一步是检测棋盘格角点并计算相机的内部参数,第二步是计算相机的外部参数。
第一步:检测棋盘格角点并计算相机的内部参数
棋盘格标定法是一种常用的相机标定方法,它基于在棋盘格上已知的角点坐标和实际测量的角点在图像中的位置,通过最小化重投影误差来求解相机的内部参数。具体步骤如下:
- 选择一个棋盘格图案,并测量棋盘格的大小和格点数量。
- 在不同的方向、距离和角度下拍摄多张包含棋盘格的图片,并将图片转换为灰度图。
- 对每张图片中的棋盘格进行角点检测,得到角点的像素坐标。
- 将每张图片中的角点像素坐标与棋盘格中的角点物理坐标对应起来,得到相机的内部参数矩阵和畸变系数。
- 使用Levenberg-Marquardt算法最小化重投影误差,得到相机的内部参数矩阵和畸变系数的最优解。
第二步:计算相机的外部参数
在得到相机的内部参数后,可以使用PnP算法计算相机的外部参数。PnP算法是一种基于3D-2D点对的相机姿态估计算法,根据已知的3D点和它们在图像中的对应2D点,计算相机的旋转向量和平移向量,即相机的外部参数。具体步骤如下:
- 确定一组已知的3D点和它们在图像中的对应2D点。
- 根据相机的内部参数矩阵和畸变系数,将2D点坐标转换为归一化相机坐标系下的坐标。
- 使用PnP算法求解相机的旋转向量和平移向量,即相机的外部参数。
在实际应用中,相机标定通常需要采集多张图像,并进行角点检测和匹配,然后使用标定算法计算相机的内部参数和外部参数。OpenCV中提供了相机标定的函数,可以方便地实现相机标定功能。例如,cv2.calibrateCamera()函数可以根据一组已知的3D点和它们在图像中的对应2D点,计算相机的内部参数和畸变系数,同时也可以计算相机的外部参数。
相机标定原理
基本原理
相机标定的原理是利用相机成像的知识,通过对多张已知场景的图片进行分析,从而估算出相机的内部参数矩阵和畸变系数,进而估算出相机的外部参数。
相机的内部参数矩阵包含了相机的焦距、光心位置、像素宽高比等参数,是一个3×3的矩阵,可以表示为:
fx 0 cx
0 fy cy
0 0 1
其中,fx和fy表示相机在x轴和y轴方向上的焦距,cx和cy表示相机光心的像素坐标。当相机的内部参数矩阵确定后,就可以通过将3D场景中的点投影到2D图像平面上,计算出它在图像中的像素坐标。
相机的畸变系数包括径向畸变和切向畸变两个部分。径向畸变是由于相机镜头的物理结构而导致的,使得图像中心和边缘的像素不在同一平面上,从而引起图像中心处的放大和边缘处的收缩,表现为图像中心向外凸出。切向畸变是由于相机镜头和图像平面不平行而产生的,表现为图像中心处的像素不在同一水平线上。
相机标定的基本原理是通过拍摄多张包含已知场景的图片,对每张图片中的角点进行检测和匹配,然后利用这些角点的图像坐标和3D场景中的物理坐标,求解相机的内部参数矩阵和畸变系数。
在确定相机的内部参数之后,可以使用PnP算法计算相机的外部参数。PnP算法是一种基于3D-2D点对的相机姿态估计算法,根据已知的3D点和它们在图像中的对应2D点,计算相机的旋转向量和平移向量,进而得到相机的外部参数。同时,也可以使用双目视觉或多目视觉等技术,通过多个相机之间的匹配,计算出相机的外部参数和场景的三维结构。
针孔相机成像原理其实就是利用投影将真实的三维世界坐标转换到二维的相机坐标上去,其模型示意图如下图所示:
从图中我们可以看出,在世界坐标中的一条直线上的点在相机上只呈现出了一个点,其中发生了非常大的变化,同时也损失和很多重要的信息,这正是我们3D重建、目标检测与识别领域的重点和难点。实际中,镜头并非理想的透视成像,带有不同程度的畸变。理论上镜头的畸变包括径向畸变和切向畸变,切向畸变影响较小,通常只考虑径向畸变。
相机标定的作用
(1)一个是由于每个镜头的在生产和组装过程中的畸变程度各不相同,通过相机标定可以校正这种镜头畸变,生成矫正后的图像——矫正透镜畸变;
(2)另一个是根据标定后的到的相机参数建立相机成像几何模型,由获得的图像重构出三维场景。具体来说:当我们用摄像机拍照时,从照片里得到一些空间信息(比如距离,尺寸等),是要利用二维图像得到三维信息。我们拍照的时候把空间物体信息通过摄像机变成了二维图像,这个过程本来是不可逆的。但如果我们可以找到一个摄像机的数学模型,就可以 :从二维图像+模型逆推得到原来三维信息。标定就是在找这个模型。
相机标定实际应用
- 相机在出厂之前都需要进行相机标定,用软件的方法校正生成的图像,避免拍摄出的图像产生桶形和枕形畸变;
- 根据相机成像的几何模型,将世界坐标系中的3D物体映射到2D成像平面上;
- 求解多个相机对之间的映射关系。
相机标定后结果
- 相机的内参矩阵 A ( d x , d y , r , u , v , f ) A(dx, dy, r, u, v, f) A(dx,dy,r,u,v,f),外参矩阵 [ R ∣ T ] [R|T] [R∣T]、畸变系数 [ k 1 , k 2 , k 3 , p 1 , p 2 ] [k1, k2, k3, p1, p2] [k1,k2,k3,p1,p2]。
- 内参矩阵各元素意义:一个像素的物理尺寸 d x dx dx和 d y dy dy,焦距 f f f,图像物理坐标的扭曲因子 r r r,图像原点相对于光心成像点的的纵横偏移量 u u u和 v v v(像素为单位)。
- 外参矩阵: 世界坐标系转换到相机坐标系的旋转 R R R和平移 T T T矩阵。
- 畸变系数: 包括相机的径向畸变系数 k 1 , k 2 , k 3 k1, k2, k3 k1,k2,k3和相机的切向畸变系数 p 1 , p 2 p1, p2 p1,p2。
张正友黑白棋盘格标定法(Zhang’s calibration method)
张正友黑白棋盘格标定法是一种基于棋盘格的相机标定方法,由张正友教授在1999年提出。这种方法通过使用黑白相间、大小固定的棋盘格来检测相机的内部参数和畸变系数,具有简单易行、精度高等优点。
棋盘格标定法的基本原理是在已知棋盘格的物理坐标和图像坐标的情况下,利用相机的内部参数和畸变系数,建立从物理坐标到图像坐标的映射关系。
张正友标定法利用黑白棋盘格标定板,在得到一张标定板的图像之后,用Harris角点检测算法得到每一个角点的像素坐标 ( u , v ) (u,v) (u,v)。
张正友标定法将世界坐标系固定于棋盘格上,则棋盘格上任一点的物理坐标W=0,由于标定板的世界坐标系是人为事先定义好的,标定板上每一个格子的大小是已知的,我们可以计算得到每一个角点在世界坐标系下的物理坐标 ( U , V , W = 0 ) (U,V,W=0) (U,V,W=0)。
我们将利用这些信息:每一个角点的像素坐标、每一个角点在世界坐标系下的物理坐标,来进行相机的标定,获得相机的内外参矩阵、畸变参数。
算法步骤
单应性矩阵H
单应性:在计算机视觉中被定义为一个平面到另一个平面的投影映射。首先确定,图像平面与标定物棋盘格平面的单应性。
设三维世界坐标的点为 X = [ X , Y , Z , 1 ] T X=[X, Y, Z, 1]^T X=[X,Y,Z,1]T,二维相机平面像素坐标为 m = [ u , v , 1 ] T m=[u, v,1]^T m=[u,v,1]T,所以标定用的棋盘格平面到图像平面的单应性关系为: s 0 m = K [ R ∣ T ] X s_0m=K[R|T]X s0m=K[R∣T]X (其中, K K K为相机的内参矩阵, R R R为外部参数矩阵(旋转矩阵), T T T为平移向量。令:
K = [ α γ u 0 0 β v 0 0 0 1 ] \begin{equation} K={\left[ \begin{array}{ccc} \alpha & \gamma & u_0\\ 0 & \beta & v_0\\ 0 & 0 & 1 \end{array} \right ]} \end{equation} K=
α00γβ0u0v01
Z = 0 Z=0 Z=0的平面,定义旋转矩阵 R R R的第 i i i列为 r i r_i ri, 则有:
s [ u v 1 ] = K [ r 1 r 2 r 3 t ] [ X Y 0 1 ] = K [ r 1 r 2 t ] [ X Y 1 ] \begin{equation} s{\left[ \begin{array}{ccc} u \\ v \\ 1 \end{array} \right ]}=K{\left[ \begin{array}{ccc} r_1 & r_2 & r_3 & t \end{array} \right ]}{\left[ \begin{array}{ccc} X \\ Y \\ 0 \\ 1 \end{array} \right ]}= K{\left[ \begin{array}{ccc} r_1 & r_2 & t \end{array} \right ]}{\left[ \begin{array}{ccc} X \\ Y \\ 1 \end{array} \right ]} \end{equation} s
uv1
=K[r1r2r3t]
XY01
=K[r1r2t]
XY1