OpenCV相机标定原理及实现(普通相机标定、鱼眼相机标定)

前言

OpenCV相机标定包括普通相机标定和鱼眼相机标定,其中普通相机标定参考的是张正友标定法,而鱼眼相机的标定是基于等距投影模型进行标定的.

普通相机标定

张正友标定法

(1) 针孔模型内外参标定

针孔相机投影模型方程:
s m ~ = A [ R t ] M ~ (1) s\widetilde{\mathbf{m}} = \mathbf{A}\begin{bmatrix} \mathbf{R} & \mathbf{t} \end{bmatrix} \widetilde{M} \tag{1} sm =A[Rt]M (1)
式中 M ~ \widetilde{M} M 表示世界坐标系下三维空间点坐标, m ~ \widetilde{\mathbf{m}} m 表示对应的投影像素坐标, A \mathbf{A} A表示相机内参, [ R t ] \begin{bmatrix} \mathbf{R} & \mathbf{t} \end{bmatrix} [Rt]表示相机外参(世界坐标系与相机坐标系之间的坐标变换关系), s s s表示任意尺度因子.
对公式(1)进行展开,可得下式:
s [ u v 1 ] = A [ r 1 r 2 r 3 t ] [ X Y Z 1 ] (2) s\begin{bmatrix} u \\ v\\ 1\end{bmatrix} = \mathbf{A}\begin{bmatrix} \mathbf{r}_{1} & \mathbf{r}_{2} & \mathbf{r}_{3} & \mathbf{t} \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z\\ 1\end{bmatrix} \tag{2} suv1=A[r1r2r3t]XYZ1(2)
式中 ( r 1 , r 2 , r 3 ) (\mathbf{r}_{1}, \mathbf{r}_{2}, \mathbf{r}_{3}) (r1,r2,r3)表示旋转矩阵 R \mathbf{R} R的三个列向量.将世界坐标系定义在一块标定板上(z轴垂直与标定板平面),则标定板上任意三维空间点坐标可表示为 ( X , Y , 0 ) (X, Y, 0) (X,Y,0),基于此定义,可将公式(2)简化为:
s [ u v 1 ] = A [ r 1 r 2 t ] [ X Y 1 ] = H [ X Y 1 ] (3) s\begin{bmatrix} u \\ v\\ 1\end{bmatrix} = \mathbf{A}\begin{bmatrix} \mathbf{r}_{1} & \mathbf{r}_{2} & \mathbf{t} \end{bmatrix} \begin{bmatrix} X \\ Y \\ 1\end{bmatrix} = \mathbf{H}\begin{bmatrix} X \\ Y \\ 1\end{bmatrix} \tag{3} suv1=A[r1r2t]XY1=HXY1(3)
H = [ h 1 h 2 h 3 ] \mathbf{H}=\begin{bmatrix} \mathbf{h}_{1} & \mathbf{h}_{2} & \mathbf{h}_{3} \end{bmatrix} H=[h1h2h3],则有:
[ h 1 h 2 h 3 ] = λ A [ r 1 r 2 t ] (4) \begin{bmatrix} \mathbf{h}_{1} & \mathbf{h}_{2} & \mathbf{h}_{3} \end{bmatrix} = \lambda \mathbf{A}\begin{bmatrix} \mathbf{r}_{1} & \mathbf{r}_{2} & \mathbf{t} \end{bmatrix} \tag{4} [h1h2h3]=λA[r1r2t](4)
A \mathbf{A} A移到公式(4)左边,有:
[ A − 1 h 1 A − 1 h 2 A − 1 h 3 ] = λ [ r 1 r 2 t ] (4) \begin{bmatrix} \mathbf{A}^{-1}\mathbf{h}_{1} & \mathbf{A}^{-1}\mathbf{h}_{2} & \mathbf{A}^{-1}\mathbf{h}_{3} \end{bmatrix} = \lambda\begin{bmatrix} \mathbf{r}_{1} & \mathbf{r}_{2} & \mathbf{t} \end{bmatrix} \tag{4} [A1h1A1h2A1h3]=λ[r1r2t](4)
由于 ( r 1 , r 2 ) (\mathbf{r}_{1},\mathbf{r}_{2}) (r1,r2)是旋转矩阵 R \mathbf{R} R的两个列向量,并且旋转矩阵是正定的,所以 ( r 1 , r 2 ) (\mathbf{r}_{1},\mathbf{r}_{2}) (r1,r2)是标准正交向量组,即满足下式:
{ r 1 ⋅ r 2 = 0 = ( A − 1 h 1 ) T ( A − 1 h 2 ) = h 1 T A − T A − 1 h 2 r 1 ⋅ r 1 = 1 = ( A − 1 h 1 ) T ( A − 1 h 1 ) = h 1 T A − T A − 1 h 1 r 2 ⋅ r 2 = 1 = ( A − 1 h 2 ) T ( A − 1 h 2 ) = h 2 T A − T A − 1 h 2 (5) \left\{\begin{matrix} \mathbf{r}_{1}\cdot \mathbf{r}_{2} = 0 = (\mathbf{A}^{-1}\mathbf{h}_{1})^{T}(\mathbf{A}^{-1}\mathbf{h}_{2}) = \mathbf{h}_{1}^{T}\mathbf{A}^{-T}\mathbf{A}^{-1}\mathbf{h}_{2}\\ \mathbf{r}_{1}\cdot \mathbf{r}_{1} = 1 = (\mathbf{A}^{-1}\mathbf{h}_{1})^{T}(\mathbf{A}^{-1}\mathbf{h}_{1}) = \mathbf{h}_{1}^{T}\mathbf{A}^{-T}\mathbf{A}^{-1}\mathbf{h}_{1} \\ \mathbf{r}_{2}\cdot \mathbf{r}_{2} = 1 = (\mathbf{A}^{-1}\mathbf{h}_{2})^{T}(\mathbf{A}^{-1}\mathbf{h}_{2}) = \mathbf{h}_{2}^{T}\mathbf{A}^{-T}\mathbf{A}^{-1}\mathbf{h}_{2} \end{matrix}\right. \tag{5} r1r2=0=(A1h1)T(A1h2)=h1TATA1h2r1r1=1=(A1h1)T(A1h1)=h1TATA1h1r2r2=1=(A1h2)T(A1h2)=h2TATA1h2(5)
简化公式(5)可得:
{ 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 (6) \left\{\begin{matrix} \mathbf{h}_{1}^{T}\mathbf{A}^{-T}\mathbf{A}^{-1}\mathbf{h}_{2} = 0\\ \mathbf{h}_{1}^{T}\mathbf{A}^{-T}\mathbf{A}^{-1}\mathbf{h}_{1} = \mathbf{h}_{2}^{T}\mathbf{A}^{-T}\mathbf{A}^{-1}\mathbf{h}_{2} \end{matrix}\right. \tag{6} {h1TATA1h2=0h1TATA1h1=h2TATA1h2(6)
将公式(6)中的 A − T A − 1 \mathbf{A}^{-T}\mathbf{A}^{-1} ATA1 看成一个整体,可以将其转换成齐次方程组 A i x = 0 \mathbf{A_{i}x} = \mathbf{0} Aix=0的形式,由于 A − T A − 1 \mathbf{A}^{-T}\mathbf{A}^{-1} ATA1 的自由度为6,因此至少需要三组匹配点构成至少6个方程来求解齐次方程组中的 x \mathbf{x} x,对于齐次方程组的求解可利用svd方法,此处求解的详细过程是简单的数值分析的知识(略).通过多组匹配点求解出相机内参矩阵 A \mathbf{A} A之后,可通过下式计算出外参矩阵:
r 1 = λ A − 1 h 1 r 2 = λ A − 1 h 2 r 3 = r 1 × r 2 t = λ A − 1 h 3 (7) \begin{aligned} \mathbf{r}_{1} &= \lambda\mathbf{A}^{-1}\mathbf{h}_{1} \\ \mathbf{r}_{2} &= \lambda\mathbf{A}^{-1}\mathbf{h}_{2} \\ \mathbf{r}_{3} &= \mathbf{r}_{1} \times \mathbf{r}_{2} \\ \mathbf{t} &= \lambda\mathbf{A}^{-1}\mathbf{h}_{3} \end{aligned} \tag{7} r1r2r3t=λA1h1=λA1h2=r1×r2=λA1h3(7)

(2) 引入畸变模型

张正友标定法中只考虑了径向畸变,其畸变方程如下:
[ ( u − u 0 ) ( x 2 + y 2 ) ( u − u 0 ) ( x 2 + y 2 ) 2 ( v − v 0 ) ( x 2 + y 2 ) ( v − v 0 ) ( x 2 + y 2 ) 2 ] [ k 1 k 2 ] = [ u ˇ − u v ˇ − v ] (8) \begin{bmatrix} (u - u_{0})(x^{2} + y^{2}) & (u - u_{0})(x^{2} + y^{2})^{2} \\ (v - v_{0})(x^{2} + y^{2}) & (v - v_{0})(x^{2} + y^{2})^{2} \end{bmatrix} \begin{bmatrix} k_{1} \\ k_{2} \end{bmatrix}= \begin{bmatrix} \check{u} - u \\ \check{v} - v \end{bmatrix} \tag{8} [(uu0)(x2+y2)(vv0)(x2+y2)(uu0)(x2+y2)2(vv0)(x2+y2)2][k1k2]=[uˇuvˇv](8)
式中 ( u , v ) (u,v) (u,v) 表示理想的通过针孔模型获得的投影像素坐标, ( u ˇ , v ˇ ) (\check{u},\check{v}) (uˇ,vˇ) 表示实际的投影像素坐标.通过式(8)可以看出一对配对点可以构建两个方程,因此通过多对匹配点构建超定方程,然后再通过SVD分解或者QR分解来求解构建的超定方程,从而可以获得畸变系数 ( k 1 , k 2 ) (k_{1}, k_{2}) (k1,k2).在获得畸变系数之后可以对先前计算获得的内外参数进行精细化,其方法是通过构建重投影残差方程,然后通过优化残差获得精细化的内外参数及畸变系数,残差方程构建如下:
Σ i = 1 n Σ j = 1 m ∥ m i j − m ˇ ( A , k 1 , k 2 , R i , t i , M j ) ∥ 2 (9) \Sigma_{i=1}^{n}\Sigma_{j=1}^{m}\left\| \mathbf{m}_{ij} - \check{\mathbf{m}}(\mathbf{A},k_{1},k_{2},\mathbf{R}_{i}, \mathbf{t}_{i}, \mathbf{M}_{j}) \right\|^{2} \tag{9} Σi=1nΣj=1mmijmˇ(A,k1,k2,Ri,ti,Mj)2(9)
式中 m i j \mathbf{m}_{ij} mij 表示世界坐标系下的点 M j \mathbf{M}_{j} Mj 在第 j j j张图像上的投影点, m ˇ \check{\mathbf{m}} mˇ 表示通过内外餐及畸变系数计算出的投影点坐标.上述方程组是非线性方程组,可通过高斯牛顿或LM方法进行迭代求解,至此实现了相机的所有参数的标记: 内参、外参、畸变系数.

(3) 标定流程
  1. 打印标定板并粘贴到平面上
  2. 在相机镜头前移动标定板获取几张照片
  3. 检测图像中的特征点(标定板角点)
  4. 使用公式(6)构建的方程组计算相机内参和外参
  5. 使用公式(8)计算相机畸变
  6. 使用公式(9)对相机内外参和畸变系数进行进一步精细化.

OpenCV标定算法

OpenCV对于普通相机的标定方法基本上与张正友标定法一致,只是其考虑了相机的径向畸变和桶形畸变,分别如下:
径向畸变:
在这里插入图片描述
桶形畸变:
在这里插入图片描述
因此其畸变参数为 ( k 1 , k 2 , p 1 , p 2 , p 3 ) (k_{1}, k_{2}, p_{1}, p_{2}, p_{3}) (k1,k2,p1,p2,p3). 其余参数和流程与张正友标定一致.

鱼眼相机标定

OpenCV中将鱼眼相机区分开进行标定,原因是等距投影模型更能真实的刻画鱼眼相机的投影过程,其投影方程如下:
在这里插入图片描述
上面公式中 X \mathbf{X} X表示世界坐标系下的三维点, ( R , t ) (\mathbf{R}, \mathbf{t}) (R,t)表示相机外参, X c \mathbf{X}_{c} Xc表示相机坐标系下的三维点, ( u , v ) (u, v) (u,v)为投影的像素坐标.该投影模型与普通相机的投影模型相比反而更简单,其标定的参数包括相机内参 ( f x , f y , c x , c y ) (f_{x}, f_{y}, c_{x}, c_{y}) (fx,fy,cx,cy),外参 ( R , t ) (\mathbf{R}, \mathbf{t}) (R,t),以及畸变系数 ( k 1 , k 2 , k 3 , k 4 ) (k1, k2, k3, k4) (k1,k2,k3,k4).标定的过程与普通相机的标定过程基本一致,只是投影模型不一样而已,最后也是构建重投影残差方程,然后优化方程获取相机的内外参及畸变系数.

标定程序

https://github.com/chennuo0125-HIT/opencv_demo/tree/master/calibrate

标定结果

在这里插入图片描述

  • 9
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值