文章目录

  • 为什么要进行相机参数标定
  • 相机内参矩阵原理
  • 相机标定方法——Recap: 相机标定
  • 张正友标定法
  • 相机模型
  • 计算单应性矩阵H
  • 计算内参数矩阵
  • 计算外部参数
  • 实验(matlab实现)


为什么要进行相机参数标定

在拍摄中,相机可能会出现畸变,用软件的方法校正生成的图像,避免拍摄出的图像产生桶形和枕形畸变

张正友棋盘格标定法python_matlab


不同的镜头的在生产和组装过程中的畸变程度各不相同,通过相机标定可以校正这种镜头畸变,生成矫正后的图像。

相机内参矩阵原理

针孔相机模型

张正友棋盘格标定法python_相机内参矩阵求解_02

设P=(X,Y,Z)为场景中的一点,在针孔相机模型中,其要经过以下几个变换,最终变为二维图像上的像点p=(μ,ν)

1、将P从世界坐标系通过刚体变换(旋转和平移)变换到相机坐标系,这个变换过程使用的是相机间的相对位姿,也就是相机的外参数。
2、从相机坐标系,通过透视投影变换到相机的成像平面上的像点p=(x,y)
3、将像点p从成像坐标系,通过缩放和平移变换到像素坐标系上点p=(μ,ν)

相机将场景中的三维点变换为图像中的二维点,也就是各个坐标系变换的组合,可将上面的变换过程整理为矩阵相乘的形式

张正友棋盘格标定法python_张正友棋盘格标定法python_03


矩阵K称为相机的内参数矩阵

张正友棋盘格标定法python_张正友棋盘格标定法python_04


对于大多数标准相机来说,可将扭曲参数γ设为0.

像主点(光心):光线坐标轴和图像平面的交点

相机标定方法——Recap: 相机标定

因为相机拍摄的照片会损失三维的信息。
因此如果要对相机进行标定,我们首先要恢复照片的三维信息
在过去,通常采用制造三个相互垂直的平面
标定工具需要有极高的精度,包括不同平面的角度、特征点的物理距离等。因此制作标定工具十分困难。

张正友棋盘格标定法python_相机内参矩阵求解_05

张正友标定法

使用棋盘格标定的方法,将照片中的三维信息压缩为二维(Z=0)

在张氏标定法中,用于标定的棋盘格是三维场景中的一个平面Π,其在成像平面的像是另一个平面π,知道了两个平面的对应点的坐标,就可以求解得到两个平面的单应矩阵H
其中,标定的棋盘格是特制的,其角点的坐标是已知的;图像中的角点,可以通过角点提取算法得到(如Harris角点),这样就可以得到棋盘平面Π和图像平面π的单应矩阵H。


张正友棋盘格标定法python_相机标定_06

方法步骤:
1、检测每张图片中的棋盘图案的角点;
2、利用解析解估算方法计算出5个内部参数,以及6个外部参数
3、通过基于极大似然准则的优化解,提高A,R,t矩阵的精度。

相机模型


张正友棋盘格标定法python_相机标定_07

张正友棋盘格标定法python_matlab_08


s: 世界坐标系到图像坐标系的尺度因子

A: 相机内参矩阵

(u0,v0): 像主点坐标

α, β: 焦距与像素横纵比的融合

γ: 径向畸变参数令棋盘格平面为Z=0的平面。

注意,s对于齐次坐标来说,不会改变齐次坐标值。

定义旋转矩阵R的第i列为 ri, 则有

张正友棋盘格标定法python_matlab_09

计算单应性矩阵H

H表示的是成像平面和标定棋盘平面之间的单应矩阵(Homographic矩阵)

可通过最小二乘,从角点世界坐标到图像坐标的关系求解

张正友棋盘格标定法python_matlab_10


张正友棋盘格标定法python_相机标定_11


H是一个齐次矩阵,所以有8个未知数,至少需要8个方程,每对对应点能提供两个方程,所以至少需要四个对应点,就可以算出世界平面到图像平面的单应性矩阵H。

计算内参数矩阵

由于旋转矩阵是个正交矩阵,r1和r2正交

张正友棋盘格标定法python_棋盘格_12

张正友棋盘格标定法python_棋盘格_13


张正友棋盘格标定法python_相机标定_14


代入可得:

张正友棋盘格标定法python_棋盘格_15

即每个单应性矩阵能提供两个方程,而内参数矩阵包含5个参数,要求解,至少需要3个单应性矩阵。为了得到三个不同的单应性矩阵,我们使用至少三幅棋盘格平面的图片进行标定。通过改变相机与标定板之间的相对位置来得到三个不同的图片。

为了方便计算,定义如下:

张正友棋盘格标定法python_matlab_16


可以看到,B是一个对称阵,所以B的有效元素为六个,让这六个元素写成向量b,即

张正友棋盘格标定法python_matlab_17


令hi为单应矩阵H的第i个行向量,则有

张正友棋盘格标定法python_相机标定_18

根据b的定义,可以推导出如下公式

张正友棋盘格标定法python_相机内参矩阵求解_19


有了上边的等式,再来看从一幅标定板图像得到的等式


张正友棋盘格标定法python_matlab_20

推出

张正友棋盘格标定法python_matlab_21


如果有n组观察图像,则V 是 2n x 6 的矩阵

张正友棋盘格标定法python_张正友棋盘格标定法python_22


根据最小二乘定义,V b = 0 的解是 VTV 最小特征值对应的特征向量。

因此, 可以直接估算出 b,后续可以通过b求解内参

当观测平面 n ≥ 3 时,可以得到b的唯一解
当 n = 2时, 一般可令畸变参数γ = 0
当 n = 1时, 仅能估算出α 与 β, 此时一般可假定像主点坐标 u0 与 v0 为0

对于方程Vb=0可以使用SVD求得其最小二乘解。对V^TV进行SVD分解,其最小特征值对应的特征向量就是Vb=0的最小二乘解,从而求得矩阵B。由于这里得到的B的估计值是在相差一个常量因子下得到的,所以有:

张正友棋盘格标定法python_棋盘格_23


张正友棋盘格标定法python_相机标定_24

计算外部参数

张正友棋盘格标定法python_棋盘格_25

张正友棋盘格标定法python_相机内参矩阵求解_26


基于极大似然准则的优化解这里不做介绍

实验(matlab实现)

设备:华为荣耀V9
matlab实现参考

实验结果
Camera Intrinsics 相机内部参数
IntrinsicMatrix: [3x3 double] 内参矩阵


张正友棋盘格标定法python_matlab_27

FocalLength: [3.2069e+03 3.2136e+03] 焦距
 PrincipalPoint: [1.9719e+03 1.4998e+03] 主点, 投影中心
 Skew: 0 倾斜参数Lens Distortion 镜头扭曲
 RadialDistortion: [0.0441 -0.2188] 径向失真
 TangentialDistortion: [0 0 ]切线失真Camera Extrinsics 相机外部参数
 RotationMatrices: [3x3x19 double] 旋转矩阵
 TranslationVectors: [19x3 double] 平移向量Accuracy of Estimation 估计准确度
 MeanReprojectionError: 1.6714 平均投影错误
 ReprojectionErrors: [35x2x19 double] 重投影错误
 ReprojectedPoints: [35x2x19 double] 重投影点Calibration Settings 校准设置
 NumPatterns: 19
 WorldPoints: [35x2 double]
 WorldUnits: ‘mm’
 EstimateSkew: 0
 NumRadialDistortionCoefficients: 2
 EstimateTangentialDistortion: 0

张正友棋盘格标定法python_张正友棋盘格标定法python_28


张正友棋盘格标定法python_相机内参矩阵求解_29


show original 原始图像

张正友棋盘格标定法python_相机标定_30


show undistorted 矫正图像

张正友棋盘格标定法python_matlab_31