天天看点

python计算机视觉_标定相机参数

hello,大家好,今天博主给大家带来的干货是如何标定相机参数。

说到标定相机参数,就不得不提到张正友教授的张正友标定法。

文章目录

    • 一、什么是张正友标定法
    • 二、计算内参和外参的初值
    • 1、计算单应性矩阵H
    • 2、计算内参数矩阵
    • 3、计算外参数矩阵
    • 三、最大似然估计
    • 四、径向畸变估计
    • 实验

一、什么是张正友标定法

”张正友标定”是指张正友教授1998年提出的单平面棋盘格的摄像机标定方法。文中提出的方法介于传统标定法和自标定法之间,但克服了传统标定法需要的高精度标定物的缺点,而仅需使用一个打印出来的棋盘格就可以。同时也相对于自标定而言,提高了精度,便于操作。因此张氏标定法被广泛应用于计算机视觉方面。

二、计算内参和外参的初值

1、计算单应性矩阵H

设三维世界坐标的点为X=[X,Y,Z,1]TX=[X,Y,Z,1]T,二维相机平面像素坐标为m=[u,v,1]Tm=[u,v,1]T,所以标定用的棋盘格平面到图像平面的单应性关系为:

python计算机视觉_标定相机参数

其中s为尺度因子,K为摄像机内参数,R为旋转矩阵,T为平移向量。令

python计算机视觉_标定相机参数

注意,s对于齐次坐标来说,不会改变齐次坐标值。张氏标定法中,将世界坐标系狗仔在棋盘格平面上,令棋盘格平面为Z=0的平面。则可得

python计算机视觉_标定相机参数

我们把K[r1, r2, t]叫做单应性矩阵H,即

python计算机视觉_标定相机参数

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

2、计算内参数矩阵

由上式可得

python计算机视觉_标定相机参数

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

python计算机视觉_标定相机参数

 代入可得:

python计算机视觉_标定相机参数

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

python计算机视觉_标定相机参数

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

python计算机视觉_标定相机参数

 可以推导得到

python计算机视觉_标定相机参数

 利用约束条件可以得到:

python计算机视觉_标定相机参数

3、计算外参数矩阵

由之前的推导,可得

python计算机视觉_标定相机参数

三、最大似然估计

上述的推导结果是基于理想情况下的解,但由于可能存在高斯噪声,所以使用最大似然估计进行优化。设我们采集了n副包含棋盘格的图像进行定标,每个图像里有棋盘格角点m个。令第i副图像上的角点Mj在上述计算得到的摄像机矩阵下图像上的投影点为:

  

python计算机视觉_标定相机参数

  其中Ri和ti是第i副图对应的旋转矩阵和平移向量,K是内参数矩阵。则角点mij的概率密度函数为:

  

python计算机视觉_标定相机参数

  构造似然函数:

  

python计算机视觉_标定相机参数

  让L取得最大值,即让下面式子最小。这里使用的是多参数非线性系统优化问题的Levenberg-Marquardt算法[2]进行迭代求最优解。

  

python计算机视觉_标定相机参数

四、径向畸变估计

张氏标定法只关注了影响最大的径向畸变。则数学表达式为:

   

python计算机视觉_标定相机参数

   其中,(u,v)是理想无畸变的像素坐标,(u,v)(u,v)是实际畸变后的像素坐标。(u0,v0)代表主点,(x,y)是理想无畸变的连续图像坐标,(x,y)(x,y)是实际畸变后的连续图像坐标。k1和k2为前两阶的畸变参数。

python计算机视觉_标定相机参数

化作矩阵形式:

python计算机视觉_标定相机参数

记做: Dk=d

则可得:

python计算机视觉_标定相机参数

计算得到畸变系数k。

  使用最大似然的思想优化得到的结果,即像上一步一样,LM法计算下列函数值最小的参数值:

  

python计算机视觉_标定相机参数

  到此,张氏标定法介绍完毕。我们也得到了相机内参、外参和畸变系数。

实验

手机型号:huawei MATE10

实验步骤:

运行matlab,打开应用程序下的

python计算机视觉_标定相机参数

接着

python计算机视觉_标定相机参数

添加图片数量宜在10-20张

python计算机视觉_标定相机参数

单击‘确定’

短暂的等待后:

python计算机视觉_标定相机参数

单击:

python计算机视觉_标定相机参数

最后单击:

python计算机视觉_标定相机参数
python计算机视觉_标定相机参数

最后返回命令行输入:cameraParams.IntrinsicMatrix

得到:

python计算机视觉_标定相机参数

FocalLength: [3.4165e+03 3.4167e+03] 焦距

PrincipalPoint: [1.4539e+03 2.0199e+03] 主点,投影中心

Skew: 0 倾斜参数

Lens Distortion 镜头扭曲

RadialDistortion: [0.1231 -0.5222] 径向失真

TangentialDistortion: [0 0] 切线失真

Camera Extrinsics 相机外部参数

RotationMatrices: [3x3x10 double] 旋转矩阵

TranslationVectors: [10x3 double] 平移向量

Accuracy of Estimation 估计准确度

MeanReprojectionError: 0.5499 平均投影错误

ReprojectionErrors: [30x2x10 double] 重投影错误

ReprojectedPoints: [30x2x10 double] 重投影点

Calibration Settings 校准设置

NumPatterns: 10

WorldPoints: [30x2 double]

WorldUnits: ‘mm’

EstimateSkew: 0

NumRadialDistortionCoefficients: 2

EstimateTangentialDistortion: 0

谢谢阅读!