相机标定张正有标定法

编程入门 行业动态 更新时间:2024-10-09 11:28:16

<a href=https://www.elefans.com/category/jswz/34/1768004.html style=相机标定张正有标定法"/>

相机标定张正有标定法

1 相机标定概念

在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定(或摄像机标定)。无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在。

2 坐标系及成像几何模型

相机标定过程建立在图像成像几何模型的基础上,涉及到了如下坐标系转换。

2.1 坐标系

2.1.1 世界坐标系

三维直角坐标系,可描述相机和实际物体的空间位置,一般用 ( X w , Y w , Z w ) (X_w,Y_w,Z_w) (Xw​,Yw​,Zw​)进行表示。

世界坐标系的原点位置可以根据需要调整。

2.1.2 相机坐标系

三维直角坐标系,一般用 ( x c , y c , z c ) (x_c,y_c,z_c) (xc​,yc​,zc​)进行表示。

以镜头光心为原点,x轴和y轴和相机两边平行,z轴为光轴,与成像屏幕垂直。

2.1.3 图像坐标系

二维直角坐标系,图像坐标系是用物理单位(例如毫米)表示像素在图像中的位置。一般需要给出各像素在两个坐标轴上的物理尺寸,比如x方向上一个像素的长度表示为 d x dx dx,y方向上一个像素的长度表示为 d y dy dy。

以CCD 图像平面的中心为坐标原点,X轴和Y 轴分别平行于图像平面的两条垂直边,用( x , y )表示其坐标值。

2.1.4 像素坐标系

二维直角坐标系,表示图像上各点的像素位置。

u轴向右为正,v轴向下为正,用(u,v)表示像素值。

2.2 成像过程的几何模型

2.2.1 世界坐标系到相机坐标系的转换

世界坐标系中的一个点映射到图像上,首先需要把该点映射到相机坐标系中。而实际情况下,相机坐标系的原点和世界坐标系的原点并不重合,映射过程可以建模为刚性变换,包含旋转和平移两个变换过程。总体可建模为:

[ x c y c z c 1 ] = [ R t 0 1 ] [ x w y w z w 1 ] \left[ \begin{matrix} x_c \\ y_c \\ z_c \\ 1\end{matrix} \right] = \left[ \begin{matrix} R~~~~t \\ 0~~~~1\end{matrix} \right]\left[ \begin{matrix} x_w \\ y_w \\ z_w \\ 1\end{matrix} \right] ⎣⎢⎢⎡​xc​yc​zc​1​⎦⎥⎥⎤​=[R    t0    1​]⎣⎢⎢⎡​xw​yw​zw​1​⎦⎥⎥⎤​

其中 R ∈ R 3 × 3 R \in R^{3 \times 3} R∈R3×3旋转矩阵, t ∈ R 3 × 1 t \in R^{3 \times 1} t∈R3×1为平移矢量, ( x c , y c , z c , 1 ) T (x_c,y_c,z_c,1)^T (xc​,yc​,zc​,1)T为相机坐标系的齐次坐标, ( x w , y w , z w , 1 ) T (x_w,y_w,z_w,1)^T (xw​,yw​,zw​,1)T为世界坐标系的齐次坐标。

2.2.2 相机坐标系到图像坐标系的转换

相机坐标系到图像坐标系的转换过程即小孔成像的过程,如下图所示。

相机坐标系中的点 P P P映射为图像坐标系中的 P ′ P^{'} P′。

因为图像坐标系的原点映射到图像坐标系上就是图像坐标系上的原点,所以 P ′ P^{'} P′点的坐标和 P P P点的坐标等比例对应。

假设 P P P点坐标为 ( x c , y c , z c ) (x_c,y_c,z_c) (xc​,yc​,zc​), P ′ P^{'} P′点坐标为 ( x ′ , y ′ ) (x^{'},y^{'}) (x′,y′),成像时的焦距定义为图像坐标系和相机坐标系的距离,即上图中的 f f f。因此有:
x ′ x c = f z c y ′ y c = f z c \frac{x^{'}}{x_c} = \frac{f}{z_c} \\ \\~~ \\ \frac{y^{'}}{y_c} = \frac{f}{z_c} xc​x′​=zc​f​  yc​y′​=zc​f​

用矩阵表示即为:
z c [ x ′ y ′ 1 ] = [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ x c y c z c 1 ] z_c\left[ \begin{matrix} x^{'} \\ y^{'} \\ 1\end{matrix} \right] = \left[ \begin{matrix} f~~~0~~~0~~~0\\0~~~f~~~0~~~0\\0~~~0~~~1~~~0\end{matrix} \right]\left[ \begin{matrix} x_c \\ y_c \\ z_c \\ 1\end{matrix} \right] zc​⎣⎡​x′y′1​⎦⎤​=⎣⎡​f   0   0   00   f   0   00   0   1   0​⎦⎤​⎣⎢⎢⎡​xc​yc​zc​1​⎦⎥⎥⎤​

2.2.3 图像坐标系到像素坐标系的转换

图像坐标系(x,y)到像素坐标系(u,v)的变换涉及到平移和尺度变换。平移是因为图像坐标系以物理成像屏幕的中心为原点,而像素坐标系以物理成像屏幕的左上角为原点。尺度变换是因为图像坐标系以实际的物理长度(如毫米)表示各像素点的位置,而图像坐标系中以数量值表示各像素点的位置,需要把图像坐标系中的物理长度转换为像素坐标系中的像素点的数量值。

两个坐标系之间的关系如下图所示:

假设图像坐标系中的一个点 ( x ′ , y ′ ) (x^{'},y^{'}) (x′,y′),映射到像素坐标系中为点 ( u , v ) (u,v) (u,v),可以表示为:
u = u 0 + x ′ d x v = v 0 + y ′ d y u = u_0 + \frac{x^{'}}{dx} \\ ~~ \\v = v_0 + \frac{y^{'}}{dy} u=u0​+dxx′​  v=v0​+dyy′​

其中, ( u 0 , v 0 ) (u_0,v_0) (u0​,v0​)为图像坐标系原点在像素坐标系中的位置。

上述映射过程用矩阵可以表示为:

[ u v 1 ] = [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ x ′ y ′ 1 ] \left[ \begin{matrix} u \\ v \\ 1\end{matrix} \right] = \left[ \begin{matrix} \frac{1}{dx}~~~0~~~u_0\\0~~~\frac{1}{dy}~~~v_0\\0~~~~~0~~~~1\end{matrix} \right]\left[ \begin{matrix} x^{'} \\ y^{'} \\ 1\end{matrix} \right] ⎣⎡​uv1​⎦⎤​=⎣⎡​dx1​   0   u0​0   dy1​   v0​0     0    1​⎦⎤​⎣⎡​x′y′1​⎦⎤​

很多情况下还假设图像坐标系的u和v两个坐标轴不互相垂直(目前暂不知道原因),两者之间的夹角为 θ \theta θ,如下图所示:

此时有:
u = u 0 + x ′ d x − y ′ cot ⁡ ( θ ) d x v = v 0 + y ′ d y sin ⁡ ( θ ) u = u_0 + \frac{x^{'}}{dx} - \frac{y^{'} \cot(\theta)}{dx} \\ ~~ \\v = v_0 + \frac{y^{'}}{dy~\sin(\theta)} u=u0​+dxx′​−dxy′cot(θ)​  v=v0​+dy sin(θ)y′​

表示为矩阵形式为:
[ u v 1 ] = [ 1 d x − cot ⁡ ( θ ) d x u 0 0 1 d y sin ⁡ ( θ ) v 0 0 0 1 ] [ x ′ y ′ 1 ] \left[ \begin{matrix} u \\ v \\ 1\end{matrix} \right] = \left[ \begin{matrix} \frac{1}{dx}~~~\frac{-\cot(\theta)}{dx}~~~u_0\\0~~~\frac{1}{dy~\sin(\theta)}~~~v_0\\0~~~~~~~~0~~~~~~~~~1\end{matrix} \right]\left[ \begin{matrix} x^{'} \\ y^{'} \\ 1\end{matrix} \right] ⎣⎡​uv1​⎦⎤​=⎣⎡​dx1​   dx−cot(θ)​   u0​0   dy sin(θ)1​   v0​0        0         1​⎦⎤​⎣⎡​x′y′1​⎦⎤​

2.2.4 总结

总结相机成像的几何模型,可以表示为:
z c [ u v 1 ] = z c [ 1 d x − cot ⁡ ( θ ) d x u 0 0 1 d y sin ⁡ ( θ ) v 0 0 0 1 ] [ x ′ y ′ 1 ] = [ 1 d x − cot ⁡ ( θ ) d x u 0 0 1 d y sin ⁡ ( θ ) v 0 0 0 1 ] [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ x c y c z c 1 ] = [ 1 d x − cot ⁡ ( θ ) d x u 0 0 1 d y sin ⁡ ( θ ) v 0 0 0 1 ] [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ R t 0 1 ] [ x w y w z w 1 ] = [ f d x − f cot ⁡ ( θ ) d x u 0 0 0 f d y sin ⁡ ( θ ) v 0 0 0 0 1 0 ] [ R t 0 1 ] [ x w y w z w 1 ] z_c\left[ \begin{matrix} u \\ v \\ 1\end{matrix} \right] = z_c\left[ \begin{matrix} \frac{1}{dx}~~~\frac{-\cot(\theta)}{dx}~~~u_0\\0~~~\frac{1}{dy~\sin(\theta)}~~~v_0\\0~~~~~~~~~~0~~~~~~~~1\end{matrix} \right]\left[ \begin{matrix} x^{'} \\ y^{'} \\ 1\end{matrix} \right]=\left[ \begin{matrix} \frac{1}{dx}~~~\frac{-\cot(\theta)}{dx}~~~u_0\\0~~~\frac{1}{dy~\sin(\theta)}~~~v_0\\0~~~~~~~~~~0~~~~~~~~1\end{matrix} \right] \left[ \begin{matrix} f~~~0~~~0~~~0\\0~~~f~~~0~~~0\\0~~~0~~~1~~~0\end{matrix} \right]\left[ \begin{matrix} x_c \\ y_c \\ z_c \\ 1\end{matrix} \right] \\= \left[ \begin{matrix} \frac{1}{dx}~~~\frac{-\cot(\theta)}{dx}~~~u_0\\0~~~\frac{1}{dy~\sin(\theta)}~~~v_0\\0~~~~~~~~~~0~~~~~~~~1\end{matrix} \right] \left[ \begin{matrix} f~~~0~~~0~~~0\\0~~~f~~~0~~~0\\0~~~0~~~1~~~0\end{matrix} \right]\left[ \begin{matrix} R~~~~t \\ 0~~~~1\end{matrix} \right]\left[ \begin{matrix} x_w \\ y_w \\ z_w \\ 1\end{matrix} \right] \\ = \left[ \begin{matrix} \frac{f}{dx}~~~\frac{-f\cot(\theta)}{dx}~~~u_0~~~0\\0~~~~\frac{f}{dy \sin(\theta)}~~~~~v_0~~~~0\\0~~~~~~~~~0~~~~~~~~~~1~~~~~0\end{matrix} \right]\left[ \begin{matrix} R~~~~t \\ 0~~~~1\end{matrix} \right]\left[ \begin{matrix} x_w \\ y_w \\ z_w \\ 1\end{matrix} \right] zc​⎣⎡​uv1​⎦⎤​=zc​⎣⎡​dx1​   dx−cot(θ)​   u0​0   dy sin(θ)1​   v0​0          0        1​⎦⎤​⎣⎡​x′y′1​⎦⎤​=⎣⎡​dx1​   dx−cot(θ)​   u0​0   dy sin(θ)1​   v0​0          0        1​⎦⎤​⎣⎡​f   0   0   00   f   0   00   0   1   0​⎦⎤​⎣⎢⎢⎡​xc​yc​zc​1​⎦⎥⎥⎤​=⎣⎡​dx1​   dx−cot(θ)​   u0​0   dy sin(θ)1​   v0​0          0        1​⎦⎤​⎣⎡​f   0   0   00   f   0   00   0   1   0​⎦⎤​[R    t0    1​]⎣⎢⎢⎡​xw​yw​zw​1​⎦⎥⎥⎤​=⎣⎢⎡​dxf​   dx−fcot(θ)​   u0​   00    dysin(θ)f​     v0​    00         0          1     0​⎦⎥⎤​[R    t0    1​]⎣⎢⎢⎡​xw​yw​zw​1​⎦⎥⎥⎤​

其中,

[ f d x − f cot ⁡ ( θ ) d x u 0 0 0 f d y sin ⁡ ( θ ) v 0 0 0 0 1 0 ] \left[ \begin{matrix} \frac{f}{dx}~~~\frac{-f\cot(\theta)}{dx}~~~u_0~~~0\\0~~~~\frac{f}{dy \sin(\theta)}~~~~~v_0~~~~0\\0~~~~~~~~~0~~~~~~~~~~1~~~~~0\end{matrix} \right] ⎣⎢⎡​dxf​   dx−fcot(θ)​   u0​   00    dysin(θ)f​     v0​    00         0          1     0​⎦⎥⎤​称为相机的内参数矩阵,是相机的固有参数,需要通过相机标定获取,且一次获取可以重复使用。

[ R t 0 1 ] \left[ \begin{matrix} R~~~~t \\ 0~~~~1\end{matrix} \right] [R    t0    1​]称为相机的外参数矩阵,用于衡量相机自身的姿态。

2.3 畸变

常见畸变分为径向畸变和切向畸变两种,畸变是相机本身的固有特性,和相机内参相同,标定一次之后即可。

径向畸变来自于透镜形状。切向畸变来自于整个摄像机的组装过程。其他类型的畸变,没有径向畸变、切向畸变显著,所以忽略不计。

特别注意:畸变都是作用在图像坐标系上的

2.3.1 径向畸变

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

光轴中心的畸变为0,沿着镜头半径方向向边缘移动,畸变越来越严重。畸变的数学模型可以用主点(principle point)周围的泰勒级数展开式的前几项进行描述,通常使用前两项,即k1和k2,对于畸变很大的镜头,如鱼眼镜头,可以增加使用第三项k3来进行描述。成像仪上某点根据其在径向方向上的分布位置,调节公式为:
x ^ = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) y ^ = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) \hat x= x(1 + k_1r^2 + k_2r^4 + k_3r^6) \\ \hat y = y(1 + k_1r^2 + k_2r^4 + k_3r^6) x^=x(1+k1​r2+k2​r4+k3​r6)y^​=y(1+k1​r2+k2​r4+k3​r6)
( x ^ , y ^ ) (\hat x,\hat y) (x^,y^​)表示畸变后的点, ( x , y ) (x,y) (x,y)表示理想的点。 r 2 = x 2 + y 2 r^2 = x^2 + y^2 r2=x2+y2表示点到图像中心的距离。

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

2.3.2 切向畸变

切向畸变是由于透镜本身与相机传感器平面(成像平面)或图像平面不平行而产生的,这种情况多是由于透镜被粘贴到镜头模组上的安装偏差导致。

畸变模型可以用两个额外的参数p1和p2来描述:

x ^ = x + ( 2 p 1 y + p 2 ( r 2 + 2 x 2 ) ) y ^ = y + ( p 1 ( r 2 + 2 y 2 ) + 2 p 2 x ) \hat x = x + (2p_1y+p_2(r^2+2x^2)) \\ \hat y = y + (p_1(r^2 + 2y^2)+2p_2x) x^=x+(2p1​y+p2​(r2+2x2))y^​=y+(p1​(r2+2y2)+2p2​x)

( x , y ) (x,y) (x,y)表示理想的坐标点, ( x ^ , y ^ ) (\hat x,\hat y) (x^,y^​)表示畸变点的位置。

2.3.3 畸变校正

相机的畸变模型共涉及了5个参数,分别是纵向畸变的 k 1 , k 2 , k 3 k_1,k_2,k_3 k1​,k2​,k3​和切向畸变的 p 1 , p 2 p_1,p_2 p1​,p2​。畸变校正就是根据畸变图像和理想图像的特征点的对应关系,估计5个参数的过程。根据估计的参数对畸变图像进行反向校正,进而通过区域裁剪等办法对畸变图像进行处理得到理想的图像。

3 张正有标定法

3.1 总体思路

张正有标定法需要使用一个棋盘格标定板,如下图所示:
实际标定过程中,需要打印一张标定板贴于某平面上,使用相机拍摄该标定板,得到一张图像。变换标定板的姿态和位置,可以得到多幅图像。这样采集的多幅图像就是标定算法的输入。

张正有标定法假设每幅标定板图像拍摄时,标定板都位于世界坐标系中 Z w = 0 Z_w = 0 Zw​=0的平面上,且 X w X_w Xw​和 Y w Y_w Yw​和标定板的两边平行。根据各个棋盘格子的宽度,可以得到各黑白块接触角点的世界坐标。对当前的标定板使用相机成像后,可以利用角点检测算法获取图像中各黑白接触角点的像素坐标。因为这些角点是一一对应的,所以可以建立多组角点从世界坐标系到像素坐标系的映射关系,也就是建立了多个方程组。通过多个方程组可以求解未知系数,也就是得到相机的内外参数矩阵和畸变系数

3.2 处理流程

算法的处理过程为:

3.3 数学推导

本节内容摘抄自:

张正友标定法标定相机的内外参数的思路如下:
1.求解内参矩阵与外参矩阵的积;
2.求解内参矩阵;
3.求解外参矩阵;
4.求解径向畸变系数。

3.3.1 求解内参数矩阵和外参数矩阵的积

将世界坐标系固定于棋盘格上,则棋盘格上任一点的物理坐标 z w = 0 z_w=0 zw​=0,因此,原单点无畸变的成像模型可以化为下式。其中, [ R 1 , R 2 ] [R_1,R_2] [R1​,R2​]为旋转矩阵 R R R 的前两列。为了简便,将内参矩阵记为 A A A。

z c [ u v 1 ] = [ f d x − f cot ⁡ ( θ ) d x u 0 0 0 f d y sin ⁡ ( θ ) v 0 0 0 0 1 0 ] [ R t 0 1 ] [ x w y w z w 1 ] = A ( R 1 R 2 t ) [ x w y w 1 ] z_c\left[ \begin{matrix} u \\ v \\ 1\end{matrix} \right] = \left[ \begin{matrix} \frac{f}{dx}~~~\frac{-f\cot(\theta)}{dx}~~~u_0~~~0\\0~~~~\frac{f}{dy \sin(\theta)}~~~~~v_0~~~~0\\0~~~~~~~~~0~~~~~~~~~~1~~~~~0\end{matrix} \right]\left[ \begin{matrix} R~~~~t \\ 0~~~~1\end{matrix} \right]\left[ \begin{matrix} x_w \\ y_w \\ z_w \\ 1\end{matrix} \right] =A(R_1~~~R_2~~~t)\left[ \begin{matrix} x_w \\ y_w \\ 1\end{matrix} \right] zc​⎣⎡​uv1​⎦⎤​=⎣⎢⎡​dxf​   dx−fcot(θ)​   u0​   00    dysin(θ)f​     v0​    00         0          1     0​⎦⎥⎤​[R    t0    1​]⎣⎢⎢⎡​xw​yw​zw​1​⎦⎥⎥⎤​=A(R1​   R2​   t)⎣⎡​xw​yw​1​⎦⎤​

对于不同的图片,内参矩阵A为定值;对于同一张图片,内参矩阵A、外参矩阵 ( R 1 , R 2 , t ) (R_1,R_2,t) (R1​,R2​,t)为定值;对同一张图像上的单个特征点,内参矩阵A、外参矩阵 ( R 1 , R 2 , t ) (R_1,R_2,t) (R1​,R2​,t)和尺度因子 z c z_c zc​为定值。

我们将 A ( R 1 R 2 t ) A(R_1~~~R_2~~~t) A(R1​   R2​   t)记为矩阵 H H H, H H H即为内参矩阵和外参矩阵的积,记矩阵 H H H的三列为 ( H 1 , H 2 , H 3 ) (H_1,H_2,H_3) (H1​,H2​,H3​),则有:
z c [ u v 1 ] = [ H 11 H 12 H 13 H 21 H 22 H 23 H 31 H 32 H 33 ] [ x w y w 1 ] z_c\left[ \begin{matrix} u \\ v \\ 1\end{matrix} \right] =\left[ \begin{matrix} H_{11}~~~H_{12}~~~H_{13} \\ H_{21}~~~H_{22}~~~H_{23} \\ H_{31}~~~H_{32}~~~H_{33}\end{matrix} \right] \left[ \begin{matrix} x_w \\ y_w \\ 1\end{matrix} \right] zc​⎣⎡​uv1​⎦⎤​=⎣⎡​H11​   H12​   H13​H21​   H22​   H23​H31​   H32​   H33​​⎦⎤​⎣⎡​xw​yw​1​⎦⎤​

利用上式,消除尺度因子 z c z_c zc​,可得:
u = H 11 x w + H 12 y w + H 13 H 31 x w + H 32 y w + H 33 v = H 21 x w + H 22 y w + H 23 H 31 x w + H 32 y w + H 33 u = \frac{H_{11}x_w + H_{12}y_w + H_{13}}{H_{31}x_w + H_{32}y_w + H_{33}} \\ ~~~\\ v = \frac{H_{21}x_w + H_{22}y_w + H_{23}}{H_{31}x_w + H_{32}y_w + H_{33}} u=H31​xw​+H32​yw​+H33​H11​xw​+H12​yw​+H13​​   v=H31​xw​+H32​yw​+H33​H21​xw​+H22​yw​+H23​​

因为已经消除了尺度因子 z c z_c zc​,所以上式对一张图像上的所有角点均成立。 ( u , v ) (u,v) (u,v)是像素坐标系下的标定板角点的坐标, ( x w , y w ) (x_w,y_w) (xw​,yw​)是世界坐标系下的标定板角点的坐标。通过图像识别算法,我们可以得到标定板角点的像素坐标 ( u , v ) (u,v) (u,v),又由于标定板的世界坐标系是人为定义好的,标定板上每一个格子的大小是已知的,我们可以计算得到世界坐标系下的 ( x w , y w ) (x_w,y_w) (xw​,yw​)。

由这里的 H H H是齐次矩阵,有8个独立未知元素。每一个标定板角点可以提供两个约束方程( u , U , V u,U,V u,U,V的对应关系、 v , U , V v,U,V v,U,V的对应关系提供了两个约束方程),因此,当一张图片上的标定板角点数量等于4时,即可求得该图片对应的矩阵 H H H。当一张图片上的标定板角点数量大于4时,利用最小二乘法回归最佳的矩阵 H H H。

至此,求得了内参参数矩阵的乘积 H H H。

3.3.2 求解内参数矩阵

我们已知了矩阵 H = ( H 1 H 2 H 3 ) = A ( R 1 R 2 t ) H =(H_1~~~H_2~~~H_3) =A(R_1~~~R_2~~~t) H=(H1​   H2​   H3​)=A(R1​   R2​   t) ,接下来需要求解相机的内参矩阵 A A A 。

我们利用 R 1 , R 2 R_1,R_2 R1​,R2​作为旋转矩阵 R R R的两列,存在单位正交的关系,即:
R 1 T R 2 = 0 R 1 T R 1 = R 2 T R 2 = 1 R_1^TR_2 = 0 \\ ~~ \\R_1^TR_1=R_2^TR_2=1 R1T​R2​=0  R1T​R1​=R2T​R2​=1

由 H H H和 R 1 , R 2 R_1,R_2 R1​,R2​的关系,可得:
R 1 = A − 1 H 1 R 2 = A − 1 H 2 R_1= A^{-1} H1 \\ R_2= A^{-1} H 2 R1​=A−1H1R2​=A−1H2

代入可得:
H 1 T A − T A − 1 H 2 = 0 H 1 T A − T A − 1 H 1 = H 2 T A − T A − 1 H 2 = 1 H 1^{T} A^{-T} A^{-1} H 2=0 \\ H 1^{T} A^{-T} A^{-1} H 1 = H 2^{T} A^{-T} A^{-1} H 2=1 H1TA−TA−1H2=0H1TA−TA−1H1=H2TA−TA−1H2=1

另外,我们发现,上述两个约束方程中均存在矩阵 A − T A − 1 A^{-T} A^{-1} A−TA−1。因此,我们记 A − T A − 1 = B A^{-T} A^{-1}=B A−TA−1=B,则 B B B为对称阵。我们试图先求解出矩阵 B B B ,通过矩阵 B B B再求解相机的内参矩阵 A A A。

3.3.3 求解外参数矩阵

这里再次强调一下,对于同一个相机,相机的内参矩阵取决于相机的内部参数,无论标定板和相机的位置关系是怎么样的,相机的内参矩阵不变。这也正是在3.3.2节“求解内参矩阵”中,我们可以利用不同的图片(标定板和相机位置关系不同)获取的矩阵 H H H,共同求解相机内参矩阵 B B B的原因。

但是,外参矩阵反映的是标定板和相机的位置关系。对于不同的图片,标定板和相机的位置关系已经改变,此时每一张图片对应的外参矩阵都是不同的

在关系: H = A ( R 1 R 2 t ) H=A(R_1~~~R_2~~~t) H=A(R1​   R2​   t)中,我们已经求解得到了矩阵 H H H(对于同一张图片相同,对于不同的图片不同)、矩阵 A A A(对于不同的图片都相同)。通过公式: ( R 1 R 2 t ) = A − 1 H (R_1~~~R_2~~~t)=A^{-1}H (R1​   R2​   t)=A−1H,即可求得每一张图片对应的外参矩阵 ( R 1 R 2 t ) (R_1~~~R_2~~~t) (R1​   R2​   t)。

注意,这里值得指出,完整的外参矩阵为 [ R t 0 1 ] \left[ \begin{matrix} R~~~~t \\ 0~~~~1\end{matrix} \right] [R    t0    1​]。但是,由于张正友标定板将世界坐标系的原点选取在棋盘格上,则棋盘格上任一点的物理坐标 z w = 0 z_w=0 zw​=0,将旋转矩阵 R R R的第三列 R 3 R_3 R3​消掉,因此, R 3 R_3 R3​在坐标转化中并没有作用。但是 R 3 R_3 R3​要使得 R R R满足旋转矩阵的性质,即列与列之间单位正交,因此可以通过向量 R 1 , R 2 R_1,R_2 R1​,R2​的叉乘,即 R 3 = R 1 × R 2 R_3=R_1 \times R_2 R3​=R1​×R2​,计算得到 R 3 R_3 R3​。

此时,相机的内参矩阵和外参矩阵均已得到。

注:以上推导都是假设不存在畸变参数的情况下成立的。但是事实上,相机是存在畸变参数的,因此,张正友标定法还需要通过L-M算法对于参数进行迭代优化。

3.3.4 求解相机的径向畸变系数

张正友标定法仅仅考虑了畸变模型中影响较大的径向畸变。

x ^ = x ′ ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) y ^ = y ′ ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) \hat x= x^{'}(1 + k_1r^2 + k_2r^4 + k_3r^6) \\ \hat y = y^{'}(1 + k_1r^2 + k_2r^4 + k_3r^6) x^=x′(1+k1​r2+k2​r4+k3​r6)y^​=y′(1+k1​r2+k2​r4+k3​r6)
( x ^ , y ^ ) (\hat x,\hat y) (x^,y^​)表示畸变后的点, ( x ′ , y ′ ) (x^{'},y^{'}) (x′,y′)表示理想的点。 r 2 = x 2 + y 2 r^2 = x^2 + y^2 r2=x2+y2表示点到图像中心的距离。

图像坐标系和像素坐标系的映射关系为:
[ u v 1 ] = [ 1 d x − cot ⁡ ( θ ) d x u 0 0 1 d y sin ⁡ ( θ ) v 0 0 0 1 ] [ x ′ y ′ 1 ] \left[ \begin{matrix} u \\ v \\ 1\end{matrix} \right] = \left[ \begin{matrix} \frac{1}{dx}~~~\frac{-\cot(\theta)}{dx}~~~u_0\\0~~~\frac{1}{dy~\sin(\theta)}~~~v_0\\0~~~~~~~~0~~~~~~~~~1\end{matrix} \right]\left[ \begin{matrix} x^{'} \\ y^{'} \\ 1\end{matrix} \right] ⎣⎡​uv1​⎦⎤​=⎣⎡​dx1​   dx−cot(θ)​   u0​0   dy sin(θ)1​   v0​0        0         1​⎦⎤​⎣⎡​x′y′1​⎦⎤​

由于 θ \theta θ接近90°,上式可以简化为:
[ u v 1 ] = [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ x ′ y ′ 1 ] \left[ \begin{matrix} u \\ v \\ 1\end{matrix} \right] = \left[ \begin{matrix} \frac{1}{dx}~~~0~~~u_0\\0~~~\frac{1}{dy}~~~v_0\\0~~~~~0~~~~1\end{matrix} \right]\left[ \begin{matrix} x^{'} \\ y^{'} \\ 1\end{matrix} \right] ⎣⎡​uv1​⎦⎤​=⎣⎡​dx1​   0   u0​0   dy1​   v0​0     0    1​⎦⎤​⎣⎡​x′y′1​⎦⎤​
即:
u = u 0 + x ′ d x v = v 0 + y ′ d y u = u_0 + \frac{x^{'}}{dx} \\ ~~ \\v = v_0 + \frac{y^{'}}{dy} u=u0​+dxx′​  v=v0​+dyy′​

那么对于畸变点 ( x ^ , y ^ ) (\hat x,\hat y) (x^,y^​),有:
u ^ = u 0 + x ^ d x v ^ = v 0 + y ^ d y \hat u = u_0 + \frac{\hat x}{dx} \\ ~~ \\\hat v = v_0 + \frac{\hat y}{dy} u^=u0​+dxx^​  v^=v0​+dyy^​​

代入径向畸变的公式中可得:
u ^ − u 0 = ( u − u 0 ) ( 1 + k 1 r 2 + k 2 r 4 ) v ^ − v 0 = ( v − v 0 ) ( 1 + k 1 r 2 + k 2 r 4 ) \begin{array}{l}{\hat{u}-u_0=\left(u-u_{0}\right)\left(1+k_{1} r^{2}+k_{2} r^{4}\right)} \\ {\hat{v}-v_0=\left(v-v_{0}\right)\left(1+k_{1} r^{2}+k_{2} r^{4}\right)}\end{array} u^−u0​=(u−u0​)(1+k1​r2+k2​r4)v^−v0​=(v−v0​)(1+k1​r2+k2​r4)​

z c [ u v 1 ] = A ( R 1 R 2 t ) [ x w y w 1 ] = H [ x w y w 1 ] z_c\left[ \begin{matrix} u \\ v \\ 1\end{matrix} \right] = A(R_1~~~R_2~~~t)\left[ \begin{matrix} x_w \\ y_w \\ 1\end{matrix} \right] = H \left[ \begin{matrix} x_w \\ y_w \\ 1\end{matrix} \right] zc​⎣⎡​uv1​⎦⎤​=A(R1​   R2​   t)⎣⎡​xw​yw​1​⎦⎤​=H⎣⎡​xw​yw​1​⎦⎤​

利用上式,消除尺度因子 z c z_c zc​,可得:
u = H 11 x w + H 12 y w + H 13 H 31 x w + H 32 y w + H 33 v = H 21 x w + H 22 y w + H 23 H 31 x w + H 32 y w + H 33 u = \frac{H_{11}x_w + H_{12}y_w + H_{13}}{H_{31}x_w + H_{32}y_w + H_{33}} \\ ~~~\\ v = \frac{H_{21}x_w + H_{22}y_w + H_{23}}{H_{31}x_w + H_{32}y_w + H_{33}} u=H31​xw​+H32​yw​+H33​H11​xw​+H12​yw​+H13​​   v=H31​xw​+H32​yw​+H33​H21​xw​+H22​yw​+H23​​

即可得到理想的、无畸变的像素坐标 ( u , v ) (u,v) (u,v)。当然,由于外参矩阵 ( R 1 R 2 t ) (R_1~~~R_2~~~t) (R1​   R2​   t)和内参矩阵 A A A是在有畸变的情况下获得的,这里得到的像素坐标 ( u , v ) (u,v) (u,v)并不是完全理想的、无畸变的。我们的总逻辑是,在进行内参矩阵和外参矩阵的求解的时候,我们假设不存在畸变;在进行畸变系数的求解的时候,我们假设求得的内参矩阵和外参矩阵是无误差的。最后,我们再通过L-M算法对于参数进行迭代优化

需要指出,上述公式推导的时候以2阶径向畸变为例,但实际上更高阶的径向畸变同理,只是需要的约束方程个数更多而已。

3.4 代码

opencv\sources\samples\cpp\tutorial_code\calib3d\camera_calibration.cpp,参数文件见同路径下的in_VID5.xml

如果想调试底层代码,可以源码编译opencv,单步调试。

参考

.html
=8&fps=1

.html



更多推荐

相机标定张正有标定法

本文发布于:2024-02-19 18:54:05,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1765456.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:相机   张正有

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!