将相机抽象成针孔模型进行建模,同时因为透镜的存在,光线投影到成像平面的过程中会产生畸变(distortion)
相机标定的目的:寻找像素坐标系到世界坐标系之间的转换关系。
相机内参:fx fy cx cy f(这个可以已知,可能和dx dy 包含到fx fy) 畸变项:k1 k2 k3 p1 p2
相机外参:R T
Virtual image plane
。Focal lenth
相机焦距相机标定涉及以下四个坐标系
world coordinate
(xw,yw,zw),是一个三维直角坐标系,以其为基准可以描述相机和待测物体的空间位置。世界坐标系的位置可以根据实际情况自由确定。camera coordinate
(xc,yc,zc),原点位于镜头光心处(针孔模型中的针孔),x、y轴分别与相面的两边平行,z轴为镜头光轴,与像平面垂直。[ X c Y c Z c 1 ] = [ R t 0 1 ] [ X w Y w Z w 1 ] \begin{bmatrix}{X_{c}}\\{Y_{c}}\\{Z_{c}}\\{1}\\\end{bmatrix} =\begin{bmatrix}{R}&{t}\\{0}&{1}\\\end{bmatrix} \begin{bmatrix}{X_{w}}\\{Y_{w}}\\{Z_{w}}\\{1}\\\end{bmatrix} XcYcZc1 =[R0t1] XwYwZw1
假设物体在空间中的三维点坐标为(Xw,Yw,Zw),通过一个刚体变换(左乘该刚体 rigid
变换),变换到相机坐标系,此时坐标变为(Xc,Yc,Zc)。为了满足矩阵乘法,添加了1
相机坐标系中的点,根据相似三角形关系,映射到光信后方的成像平面(倒像)。根据虚拟成像平面得到正像。
x / f = X c / Z c y / f = Y c / Z c x/f={X_{c}}/{Z_{c}}\\ y/f={Y_{c}}/{Z_{c}} x/f=Xc/Zcy/f=Yc/Zc
x = X c ∗ f / Z c y = Y c ∗ f / Z c x={X_{c}}*f/{Z_{c}}\\ y={Y_{c}}*f/{Z_{c}} x=Xc∗f/Zcy=Yc∗f/Zc
等式两边配平
[ x y 1 ] = [ f / Z c 0 0 0 0 f / Z c 0 0 0 0 1 / Z c 0 ] [ X c Y c Z c ] \begin{bmatrix}x\\y\\1\end{bmatrix} =\begin{bmatrix}{f/Z_{c}}&0&0&0\\0&{f/Z_{c}}&0&0\\0&0&{1/Z_{c}}&0\end{bmatrix} \begin{bmatrix}{X_{c}}\\{Y_{c}}\\{Z_{c}}\end{bmatrix} xy1 = f/Zc000f/Zc0001/Zc000 XcYcZc
像素坐标系与成像平面之间,相差了一个缩放和一个原点的平移。我们设像素坐标在 u 轴上缩放了 α 倍,在 v 上缩放了 β 倍。
像素坐标单位是pixel,不含有mm这些距离相关的信息。
假设:
{ u = c x + x / d x v = c y + y / d y \left\{\begin{matrix}u={c_{x}}+x/{d_{x}}\\v={c_{y}}+y/{d_{y}}\end{matrix}\right. {u=cx+x/dxv=cy+y/dy
等式两边配平
[ u v 1 ] = [ 1 / d x 0 c x 0 1 / d y c y 0 0 1 ] [ x y 1 ] \begin{bmatrix}u\\v\\1\end{bmatrix} =\begin{bmatrix} 1/{d_{x}}&0&{c_{x}}\\ 0&1/{d_{y}}&{c_{y}}\\ 0&0&1 \end{bmatrix} \begin{bmatrix} x\\y\\1 \end{bmatrix} uv1 = 1/dx0001/dy0cxcy1 xy1
[ u v 1 ] = [ 1 / d x 0 c x 0 1 / d y c y 0 0 1 ] [ f / Z c 0 0 0 0 f / Z c 0 0 0 0 1 / Z c 0 ] [ R t 0 1 ] [ X w Y w Z w 1 ] \begin{bmatrix} u\\v\\1 \end{bmatrix} =\begin{bmatrix} 1/{d_{x}}&0&{c_{x}}\\ 0&1/{d_{y}}&{c_{y}}\\ 0&0&1 \end{bmatrix} \begin{bmatrix}{f/Z_{c}}&0&0&0\\0&{f/Z_{c}}&0&0\\0&0&{1/Z_{c}}&0\end{bmatrix} \begin{bmatrix}{R}&{t}\\{0}&{1}\\\end{bmatrix} \begin{bmatrix}{X_{w}}\\{Y_{w}}\\{Z_{w}}\\{1}\\\end{bmatrix} uv1 = 1/dx0001/dy0cxcy1 f/Zc000f/Zc0001/Zc000 [R0t1] XwYwZw1
将以下矩阵的乘积成为相机内参矩阵intrinsics matrix
[ 1 / d x 0 c x 0 1 / d y c y 0 0 1 ] [ f / Z c 0 0 0 0 f / Z c 0 0 0 0 1 / Z c 0 ] (1) \begin{bmatrix} 1/{d_{x}}&0&{c_{x}}\\ 0&1/{d_{y}}&{c_{y}}\\ 0&0&1 \end{bmatrix} \begin{bmatrix}{f/Z_{c}}&0&0&0\\0&{f/Z_{c}}&0&0\\0&0&{1/Z_{c}}&0\end{bmatrix} \tag{1} 1/dx0001/dy0cxcy1 f/Zc000f/Zc0001/Zc000 (1)
[ f x s c x 0 0 f y c y 0 0 0 1 0 ] (2) \begin{bmatrix} {f_{x}}&s&{c_{x}}&0\\ 0&{f_{y}}&{c_{y}}&0\\ 0&0&1&0 \end{bmatrix} \tag{2} fx00sfy0cxcy1000 (2)
s的定义,普通计算时,一般将s假设为0
刚体变换。相机外参矩阵extrinsics matrix
4*4
[ R t 0 1 ] \begin{bmatrix}{R}&{t}\\{0}&{1}\\\end{bmatrix} [R0t1]
由透镜引起的畸变称为径向畸变 Radial distortion
桶形畸变 barrel distortion 越靠近图像中心,图像越被放大
枕型畸变 pincushion distortion 越远离图像中心,图像越被放大
由于透镜与成像平面不平行而导致的畸变成为切向畸变 Tangential Distortion
两种畸变计算(xdistorted, ydistorted)
{ x d i s t o r t e d = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + [ 2 ∗ p 1 ∗ x ∗ y + p 2 ( r 2 + 2 ∗ x 2 ) ] y d i s t o r t e d = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + [ 2 ∗ p 1 ∗ ( r 2 + 2 ∗ y 2 ) + p 2 ∗ x ∗ y ] \left\{\begin{matrix}x_{distorted}=x(1+{k_{1}r^{2}}+{k_{2}r^{4}}+{k_{3}r^{6}})+[2*p_1*x*y+p_2(r^2+2*x^2)]\\y_{distorted}=y(1+{k_{1}r^{2}}+{k_{2}r^{4}}+{k_{3}r^{6}})+[2*p_1*(r^2+2*y^2)+p_2*x*y]\end{matrix}\right. {xdistorted=x(1+k1r2+k2r4+k3r6)+[2∗p1∗x∗y+p2(r2+2∗x2)]ydistorted=y(1+k1r2+k2r4+k3r6)+[2∗p1∗(r2+2∗y2)+p2∗x∗y]
在没有畸变时,相机坐标系到像素坐标系的转换
{ u = f x ∗ X c + c x v = f x ∗ Y c + c y \left\{ \begin{matrix} u=f_x*X_c+c_x\\ v=f_x*Y_c+c_y \end{matrix} \right. {u=fx∗Xc+cxv=fx∗Yc+cy
引入畸变后
{ u = f x ∗ X d i s t o r t e d + c x v = f x ∗ Y d i s t o r t e d + c y \left\{ \begin{matrix} u=f_x*X_{distorted}+c_x\\ v=f_x*Y_{distorted}+c_y \end{matrix} \right. {u=fx∗Xdistorted+cxv=fx∗Ydistorted+cy
坐标点沿着长度方向发生了变化,也就是距离原点的长度发生变化
(xdistorted, ydistorted)
r2 = x2+y2 (将x,y 转成极坐标表示[r,/σ])
k1 k2k3 径向畸变系数
{ x d i s t o r t e d = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) y d i s t o r t e d = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) \left\{ \begin{matrix} x_{distorted}=x(1+{k_{1}r^{2}}+{k_{2}r^{4}}+{k_{3}r^{6}})\\ y_{distorted}=y(1+{k_{1}r^{2}}+{k_{2}r^{4}}+{k_{3}r^{6}}) \end{matrix} \right. {xdistorted=x(1+k1r2+k2r4+k3r6)ydistorted=y(1+k1r2+k2r4+k3r6)
坐标点沿着切线方向发生变化,水平夹角发生变化
(xdistorted, ydistorted)
r2 = x2+y2
{ x d i s t o r t e d = x + [ 2 ∗ p 1 ∗ x ∗ y + p 2 ( r 2 + 2 ∗ x 2 ) ] y d i s t o r t e d = y + [ 2 ∗ p 1 ∗ ( r 2 + 2 ∗ y 2 ) + p 2 ∗ x ∗ y ] \left\{ \begin{matrix} x_{distorted}=x+[2*p_1*x*y+p_2(r^2+2*x^2)]\\ y_{distorted}=y+[2*p_1*(r^2+2*y^2)+p_2*x*y] \end{matrix} \right. {xdistorted=x+[2∗p1∗x∗y+p2(r2+2∗x2)]ydistorted=y+[2∗p1∗(r2+2∗y2)+p2∗x∗y]
径向畸变 k1 k2 k3
切向畸变 p1 p2
结论: 圆点标定板的标定精度优于棋盘格
圆点标定板:中心拟合精度高,但是存在偏心误差问题。
棋盘格标定板:中心拟合精度低,但是不存在偏心误差问题
圆环的优化方法:
cv::calibrationCamera
返回 重投影误差 这个参数,一般来说,重投影误差越小,表示这次标定精度越好重投影误差 re-projection error
影响因素:
角点检测精度
相机本身噪声,相机固定
相机分辨率,其他条件相同,分辨率高的话,re-projection error可能会更大(单位是像素)
相机本身的标定算法的最优化
其它思路:
solvePnP
已知n点之间的对应关系,怎么求它们之间的关系。
已知3D点,对应2D角点,图像坐标系到像素坐标系的变换,畸变参数,去求某一张图片的外参