OpenCV中的相机模型 | HyperPlane

OpenCV中的相机模型

简要整理了一下OpenCV中的相机模型

最基础的就是小孔成像模型,简要描述一下。对于一个在相机坐标系下的点(X,Y,Z)(X,Y,Z),其通过小孔投影到归一化平面上的坐标为

x=X/Zy=Y/Z\begin{aligned} x &= X / Z \\ y &= Y / Z \end{aligned}

但是实际中由于镜头曲面和装配的原因会导致图像产生畸变。OpenCV中考虑了径向畸变和切向畸变。

径向畸变是指成像装置边缘的畸变,远离透镜中心的区域比透镜中心光线更弯曲,是由透镜曲面造成。对于径向畸变OpenCV中使用这样的公式:

xdistorted=x(1+k1r2+k2r4+k3r6)ydistorted=y(1+k1r2+k2r4+k3r6)\begin{aligned} x_{distorted} &= x(1 + k_1r^2 + k_2r^4 + k_3r^6) \\ y_{distorted} &= y(1 + k_1r^2 + k_2r^4 + k_3r^6) \end{aligned}

如果考虑得再多一点,k4k6k4-k6有值的话,公式如下:

xdistorted=x1+k1r2+k2r4+k3r61+k4r2+k5r4+k6r6ydistorted=y1+k1r2+k2r4+k3r61+k4r2+k5r4+k6r6\begin{aligned} x_{distorted} &= x\frac{1 + k_1r^2 + k_2r^4 + k_3r^6}{1 + k_4r^2 + k_5r^4 + k_6r^6} \\ y_{distorted} &= y\frac{1 + k_1r^2 + k_2r^4 + k_3r^6}{1 + k_4r^2 + k_5r^4 + k_6r^6} \end{aligned}

可见径向畸变是对称的。

切向畸变是指装配中透镜和成像平面不平行造成的畸变。切向畸变的表达式为:

xdistorted=x+[2p1xy+p2(r2+2x2)]ydistorted=y+[p1(r2+2y2)+2p2xy]\begin{aligned} x_{distorted} &= x + [2 p_1 xy + p_2 (r^2 + 2 x^2)] \\ y_{distorted} &= y + [p_1 (r^2 + 2y^2) + 2 p_2 xy] \end{aligned}

以上公式中, [k1,k2,k3,k4,k5,k6,p1,p2][k_1, k_2, k_3, k_4, k_5, k_6, p_1, p_2]为畸变参数,r2=x2+y2r^2 = x^2 + y^2

将上面的内容合并起来,径向畸变和切向畸变一起考虑,可以得到

xdistorted=x1+k1r2+k2r4+k3r61+k4r2+k5r4+k6r6+[2p1xy+p2(r2+2x2)]ydistorted=y1+k1r2+k2r4+k3r61+k4r2+k5r4+k6r6+[p1(r2+2y2)+2p2xy]\begin{aligned} x_{distorted} &=x\frac{1 + k_1r^2 + k_2r^4 + k_3r^6}{1 + k_4r^2 + k_5r^4 + k_6r^6} + [2 p_1 xy + p_2 (r^2 + 2 x^2)] \\ y_{distorted} &= y\frac{1 + k_1r^2 + k_2r^4 + k_3r^6}{1 + k_4r^2 + k_5r^4 + k_6r^6} + [p_1 (r^2 + 2y^2) + 2 p_2 xy] \end{aligned}

这是最常用到的畸变模型了,一般来说用到的畸变模型也就到此为止。

在OpenCV中畸变参数的排列为(k1,k2,p1,p2[,k3[,k4,k5,k6[,s1,s2,s3,s4[,τx,τy]]]])(k_1, k_2, p_1, p_2 [,k_3[,k_4, k_5, k_6[,s_1,s_2,s_3,s_4[,\tau_x, \tau_y]]]]),包含的元素个数必须为4、5、8、12或者14。

剩下的6个参数使用相对比较少一点,这里不具体描述。详细内容可以参考OpenCV官方文档