相机的标定

这里主要讲解的不是如何标定,而是为什么需要标定?标定会涉及到那些变量?更好地理解摄像机原理。

为什么要标定?

摄像机模型小节中,我们讲到了摄像机模型:

P=K*[R|t]=K*\begin{bmatrix}R&&t\\0^T&&1\end{bmatrix}

x=P*X 此处X是世界坐标系下的位置。

这里面的K为摄像机的内部参数。

K=\begin{bmatrix}\alpha_x&&0&&u_0&&0\\0&&\alpha_y&&v_0&&0\\0&&0&&1&&0\end{bmatrix}

其中 \alpha_x=f*m_x\alpha_y=f*m_y ,f为摄像机焦距,m分别表示在x和y方向上图像坐标单位距离的像素数, (u_0,v_0) 表示像素量纲上图像的原点。

标定的一项工作就是确定这些内部参数.

非线性相机模型

在实际的成像过程中,考虑镜头的失真,一般都会存在非线性畸变,所以线性针孔模型是不能准确描述成像几何关系的.畸变可以由下列公式描述:

\left\{\begin{array}{ll}
\bar{x}=x+\delta_{x}{(x,y)}\\
\bar{y}=y+\delta_{y}{(x,y)}
\end{array}\right.

其中,(\bar{x},\bar{y})是由线性模型计算出来的图像点坐标的理想值,而(x,y)则是实际图像中的坐标,\delta_{x},\delta_{y}为非线性畸变,其数学表达式为:

\delta_{x}(x,y)=k_{1}x(x^{2}+y^{2})+(p_{1}(3x^{2}+y^{2})+2p_{2}xy)+s_{1}(x^{2}+y^{2})

\delta_{y}(x,y)=k_{2}x(x^{2}+y^{2})+(p_{2}(3x^{2}+y^{2})+2p_{1}xy)+s_{2}(x^{2}+y^{2})

其中,k_{1}x(x^{2}+y^{2})是径向畸变,p_{1}(3x^{2}+y^{2})+2p_{2}xy是离心畸变,而s_{1}(x^{2}+y^{2})是薄棱镜畸变.

式中k_{1}\,k_{2}\,p_{1}\,p_{2}\,s_{1}\,s_{2}为非线性畸变参数.

有研究表明引入过多的非线性参入,不仅不能提高精度,还可能导致解的不稳定性(而且现在相机中一般有自校正模块).一般比较常见的是径向畸变:

\bar{x}=x(1+k_{1}r^{2})

r^{2}=x^{2}+y^{2}为径向半径,所以图像边缘处畸变较大.

径向畸变

在制作上讲,制作一个"球形"的透镜比一个数学上的理想透镜要容易,这产生了径向畸变.径向畸变在成像仪中心的畸变为0,随着向边缘移动,畸变也越严重,一般成像仪某点的径向位置按下式调节:

x_{c}=x(1+k_{1}r^{2}+k_{2}r^{4}+k_{3}r^{6})

y_{c}=y(1+k_{1}r^{2}+k_{2}r^{4}+k_{3}r^{6})

对于普通的网络相机,通常只使用前两项;对于畸变严重的相机,如鱼眼透镜,我们也使用第三个畸变项k_{3}.

切向畸变

由于机械方面,很难将透镜和成像仪保持完全平行,会产生切向畸变.

x_{c}=x+[p_{1}(3x^{2}+y^{2})+2p_{2}xy]

y_c=y+[p_{2}(3x^{2}+y^{2})+2p_{1}xy]

因此,我们共需要5个畸变参数,在OpenCV中成为畸变向量,是一个5*1的矩阵,按照顺序依次是k1,k2,p1,p2,k3.

至此,那为什么要做相机标定呢?

由于每个镜头的畸变程度各不相同,通过相机标定可以校正这种镜头畸变。

总结通过标定的方式来求解相机内参和畸变参数,相当于一种相机校准,然后这些参数就可以用于后面的三维重建了。

具体到如何标定,可以参考:http://blog.csdn.net/dcrmg/article/details/52939318

附上其代码,写的很有条理。

posted @ 2017-02-19 18:21  侯凯  阅读(1126)  评论(0编辑  收藏  举报