相机针孔模型&内参矩阵&标定

本文是笔者的CV处女篇,聊聊最基础的相机(针孔)模型和该模型下对应的内参数矩阵,最后分享一下用Matlab标定内参矩阵的工具

针孔相机模型

针孔模型

对!就是初中生都知道的小孔成像原理,如上图所示:可以把相机内部的感光面抽象为像素平面,镜头抽象为光心和对应的焦距。坐标轴的标准定义如上图,z轴为相机正向,y向下,xyz满足右手螺旋。

那么根据三角相似原理,有:

$$
\frac Z f = -\frac{X}{X’}= -\frac{Y}{Y’}
$$

图中负号对应于物理上的倒像。那么为了简化模型,我们可以作如下对称等效处理及归一化处理

归一化成像面

那么,去掉负号并且整理:

$$
X’ = f \frac{X}{Z}
\
Y’ = f \frac{Y}{Z}
$$

内参数矩阵

在最后读取相机(感光面)数据的时候,得到的相当于是一个(存储像素数据的)二维数组,那么就建立一个面——像素平面,如下图

归一化成像面

显然像素平面坐标系和物理成像平面有线性变换关系

$$
x = \alpha \cdot X’ + Cx
\
y = \beta \cdot Y’ + Cy
$$

则把上面的针孔模型方程带进来有:

$$
x = \alpha \cdot f \frac{X}{Z} + Cx = f_x \frac{X}{Z} + Cx
\
y = \beta \cdot f \frac{Y}{Z} + Cy = f_y \frac{Y}{Z} + Cy
$$

让我们用矩阵表示来美化上面的方程:

$$
\begin{bmatrix}
x \\ y \\ 1
\end{bmatrix}
=
\frac{1}{Z}
\begin{bmatrix}
f_x & 0 & c_x \\
0 & f_y & c_y \\
0 & 0 & 1
\end{bmatrix}
\begin{bmatrix}
X \\ Y \\ Z
\end{bmatrix}
$$

上面各个矩阵的物理意义:

$$
齐次像素坐标
\begin{bmatrix}
x \\ y \\ 1
\end{bmatrix}
\\
物距Z
\\
相机内参数矩阵
\mathbf{K} = \begin{bmatrix}
f_x & 0 & c_x \\
0 & f_y & c_y \\
0 & 0 & 1
\end{bmatrix}
\\
相机坐标
\mathbf{P} =
\begin{bmatrix}
X \\ Y \\ Z
\end{bmatrix}
$$

Matlab标定相机

相机的标定,除了上述的内参矩阵外,还有外参矩阵畸变系数(这两套参数后面讨论)

Matlab支持“张正友棋盘标定法”,对!🎈这是我国学者发明的算法,只需要打印一张黑白格子交错的纸(如下图,是笔者对mi10手机标定拍的照片)

棋盘格

附:棋盘格图像生成matlab算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
%% 参数设置
GridSize = 100; %格子的宽度,单位:像素
row =10; %行
col = 6; %列
margin = 10; %四边留白

%% 预分配内存
I = ones(row*GridSize+2*margin, col*GridSize+2*margin)*255;

%% 图像赋值
for i = 1:row
if mod(i,2)==1
for j = 1:col
if mod(j,2)==1
I(1+(i-1)*GridSize+margin:i*GridSize+margin, ...
1+(j-1)*GridSize+margin:j*GridSize+margin) = 0;
end
end
else
for j = 1:col
if mod(j,2)==0
I(1+(i-1)*GridSize+margin:i*GridSize+margin,...
1+(j-1)*GridSize+margin:j*GridSize+margin) = 0;
end
end
end
end

%% 显示、保存
imshow(I);
imwrite(I,'chessboard.bmp');

  1. 打开matlab中的“Camera Calibrator”工具箱

    Calibrator

  2. 导入相机拍摄图像

    import

  3. 按照提示输入实际测量的格子宽度

    size

  4. 让matlab自动标定

    Calibrate

  5. 导出数据

    export

  6. 在matlab工作区中可查看标定数据,有:

    • camera Intrinsic:内参矩阵
    • camera Extrinsic:外参矩阵
    • Accuracy of Estimation:估计准确度
    • NumRadialDistortionCoefficients:径向畸变系数
    • EstimateTangentialDistortion:切向畸变估计

    check

OpenCV相机矫正

根据上法得到的相机参数矩阵,则实际项目使用可以在OpenCV中对相机读取到的照片进行非线性矫正。

下附C++版本的图像矫正,如果是python也是undistort接口。

1
2
3
4
5
6
7
8
// 定义相机矩阵,畸变矩阵
Mat cameraMatrix;
Mat distCoeffs;
// 直接手打输入标定参数即可;也可以OpenCV自己计算标定求解
// 当然,笔者个人比较推荐用操作JSON文件的方法自动化导入参数

// 输入图像,矫正后图像,相机矩阵,畸变矩阵
undistort(source_image, resault_image, cameraMatrix, distCoeffs)

参考文献

  • 《视觉SLAM十四讲——从理论到实践》——高翔
Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2022-2023 RY.J
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信