网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
- 在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定(或摄像机标定)。无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在。
- 常用术语
内参矩阵: Intrinsic Matrix
焦距: Focal Length
主点: Principal Point
径向畸变: Radial Distortion
切向畸变: Tangential Distortion
旋转矩阵: Rotation Matrices
平移向量: Translation Vectors
平均重投影误差: Mean Reprojection Error
重投影误差: Reprojection Errors
重投影点: Reprojected Points
1、坐标系的转换
1.1 世界坐标系
世界坐标系(world coordinate)
(xw,yw,zw)
(x_w, y_w, z_w),也称为测量坐标系,是一个三维直角坐标系,以其为基准可以描述相机和待测物体的空间位置。世界坐标系的位置可以根据实际情况自由确定。
1.2 相机坐标系
相机坐标系(camera coordinate)
(xc,yc,zc)
(x_c, y_c, z_c),也是一个三维直角坐标系,原点位于镜头光心处,x、y轴分别与相面的两边平行,z轴为镜头光轴,与像平面垂直。
1.3 世界坐标系转换为相机坐标系
⎡⎣⎢⎢⎢xcyczc1⎤⎦⎥⎥⎥=[R0t1]⎡⎣⎢⎢⎢xwywzw1⎤⎦⎥⎥⎥
\left[ \begin{matrix}
x_c \
y_c \
z_c \
1
\end{matrix} \right] = \left[ \begin{matrix}
\mathbf{R} & \mathbf{t} \
0 & 1
\end{matrix} \right] \left[ \begin{matrix}
x_w \
y_w \
z_w \
1
\end{matrix} \right]
其中
R
\mathbf{R}为3*3的旋转矩阵,
t
\mathbf{t}为3*1的平移矢量,
(xc,yc,zc,1)T
(x_c, y_c, z_c, 1)^T为相机坐标系的齐次坐标,
(xw,yw,zw,1)T
(x_w, y_w, z_w, 1)^T为世界坐标系的齐次坐标。
1.4 像素坐标系、图像坐标系
- 图1:
- 像素坐标系(pixel coordinate)
如图1,像素坐标系
uov
uov是一个二维直角坐标系,反映了相机CCD/CMOS芯片中像素的排列情况。原点
o
o位于图像的左上角,uu轴、
v
v轴分别于像面的两边平行。像素坐标系中坐标轴的单位是像素(整数)
。
像素坐标系不利于坐标变换,因此需要建立图像坐标系XOYXOY,其坐标轴的单位通常为毫米(mm)
,原点是相机光轴与相面的交点(称为主点),即图像的中心点,
X
X轴、YY轴分别与
u
u轴、vv轴平行。故两个坐标系实际是平移关系,即可以通过平移就可得到。
- 图像坐标系转换为像素坐标系
⎡⎣⎢uv1⎤⎦⎥=⎡⎣⎢1/dX0001/dY0u0v01⎤⎦⎥⎡⎣⎢XY1⎤⎦⎥
\left[ \begin{matrix}
u \
v \
1
\end{matrix} \right] = \left[ \begin{matrix}
1/dX & 0 & u_0 \
0 & 1/dY & v_0 \
0 & 0 & 1
\end{matrix} \right] \left[ \begin{matrix}
X \
Y \
1
\end{matrix} \right]
其中,
dX
dX、
dY
dY分别为像素在
X
X、YY轴方向上的物理尺寸,
u0,v0
u_0,v_0为主点(图像原点)坐标。
1.5 针孔成像原理
图2:
如图,空间任意一点
P
P与其图像点pp之间的关系,
P
P与相机光心oo的连线为
oP
oP,
oP
oP与像面的交点
p
p即为空间点PP在图像平面上的投影。
该过程为透视投影,如下矩阵表示:
s⎡⎣⎢XY1⎤⎦⎥=⎡⎣⎢f000f0001000⎤⎦⎥⎡⎣⎢⎢⎢xyz1⎤⎦⎥⎥⎥
s\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 \
y \
z \
1
\end{matrix} \right]
其中,
s
s为比例因子(ss不为0),
f
f为有效焦距(光心到图像平面的距离),(x,y,z,1)T(x,y,z,1)^T是空间点
P
P在相机坐标系oxyzoxyz中的齐次坐标,
(X,Y,1)T
(X,Y,1)^T是像点
p
p在图像坐标系OXYOXY中的齐次坐标。
1.6 世界坐标系转换为像素坐标系
s⎡⎣⎢uv1⎤⎦⎥=⎡⎣⎢1/dX0001/dY0u0v01⎤⎦⎥⎡⎣⎢f000f0001000⎤⎦⎥[R0t1]⎡⎣⎢⎢⎢xwywzw1⎤⎦⎥⎥⎥=⎡⎣⎢αx000αy0u0v01000⎤⎦⎥[R0t1]⎡⎣⎢⎢⎢xwywzw1⎤⎦⎥⎥⎥=M1M2Xw=MXw
s\left[ \begin{matrix}
u \
v \
1
\end{matrix} \right] = \left[ \begin{matrix}
1/dX & 0 & u_0 \
0 & 1/dY & 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}
\mathbf{R} & \mathbf{t} \
0 & 1
\end{matrix} \right]
\left[ \begin{matrix}
x_w \
y_w \
z_w \
1
\end{matrix} \right] \
= \left[ \begin{matrix}
\alpha_x & 0 & u_0 & 0 \
0 & \alpha_y & v_0 & 0 \
0 & 0 & 1 & 0
\end{matrix} \right]
\left[ \begin{matrix}
\mathbf{R} & \mathbf{t} \
0 & 1
\end{matrix} \right]
\left[ \begin{matrix}
x_w \
y_w \
z_w \
1
\end{matrix} \right] = \mathbf{M}_1 \mathbf{M}_2 \mathbf{X}_w = \mathbf{MX}_w
其中,
αx=f/dX
\alpha_x = f / dX、
αy=f/dY
\alpha_y = f / dY,称为
u
u、vv轴的尺度因子,
M1
\mathbf{M}_1称为相机的内部参数矩阵,
M2
\mathbf{M}_2称为相机的外部参数矩阵,
M
\mathbf{M}称为投影矩阵。
2 相机内参与畸变参数
2.1 相机内参
- 参看1.6节所述
2.2 畸变参数
- 畸变参数(distortion parameters)
畸变(distortion)
是对直线投影(rectilinear projection)的一种偏移。简单来说直线投影是场景内的一条直线投影到图片上也保持为一条直线。
畸变简单来说就是一条直线投影到图片上不能保持为一条直线了,这是一种
光学畸变(optical aberration)
,可能由于摄像机镜头的原因。
- 畸变一般可以分为:径向畸变、切向畸变
1、径向畸变来自于透镜形状
2、切向畸变来自于整个摄像机的组装过程畸变还有其他类型的畸变,但是没有径向畸变、切向畸变显著
- 畸变图示
- 径向畸变
实际摄像机的透镜总是在成像仪的边缘产生显著的畸变,这种现象来源于“筒形”或“鱼眼”的影响。
如下图,光线在原理透镜中心的地方比靠近中心的地方更加弯曲。对于常用的普通透镜来说,这种现象更加严重。筒形畸变在便宜的网络摄像机中非常厉害,但在高端摄像机中不明显,因为这些透镜系统做了很多消除径向畸变的工作。
对于径向畸变,成像仪中心(光学中心)的畸变为0,随着向边缘移动,畸变越来越严重。
- 径向畸变包括:枕形畸变、桶形畸变
- 切向畸变
- 切向畸变是由于透镜制造上的缺陷使得透镜本身与图像平面不平行而产生的。
- 切向畸变可分为:薄透镜畸变、离心畸变
- 切向畸变图示:
2.2.1 opencv中的畸变模型
- 径向畸变模型:
以下公式由泰勒展式得出,在opencv中
K=1
K=1,
r2=x2+y2
r^2 = x^2 + y^2,
(x,y)
(x,y)为真实坐标(发生畸变),
(x′,y′)
(x^{‘}, y^{’})为理想坐标。
δxr=x(k1r2+k2r4+k3r6+K)
\delta_{xr} = x( k_1 r^2 + k_2 r^4 + k_3 r^6 + K )
δyr=y(k1r2+k2r4+k3r6+K)
\delta_{yr} = y( k_1 r^2 + k_2 r^4 + k_3 r^6 + K )
- 切向畸变模型:
δxd=2p1xy+p2(r2+2x2)+K
\delta_{xd} = 2p_1 x y + p_2(r^2 + 2 x^2) + K
δyd=2p1(r2+2y2)+2p2xy+K
\delta_{yd} = 2p_1(r^2 + 2 y^2) + 2p_2 x y + K
- 理想坐标
(x′,y′)
(x^{‘}, y^{’})与真实坐标
(x,y)
(x,y):
x′=x+δxr+δxd
x^{'} = x + \delta_{xr} + \delta_{xd}
y′=y+δyr+δyd
y^{'} = y + \delta_{yr} + \delta_{yd}
也即:
[x′y′]=(1+k1r2+k2r4+k3r6)[xy]+[2p1xy+p2(r2+2x2)2p1(r2+2y2)+2p2xy]
\left[ \begin{matrix} x^{‘} \ y^{’} \end{matrix} \right] = (1 + k_1 r^2 + k_2 r^4 + k_3 r^6) \left[ \begin{matrix} x \ y \end{matrix} \right] + \left[ \begin{matrix} 2p_1 x y + p_2(r^2 + 2 x^2) \ 2p_1(r^2 + 2 y^2) + 2p_2 x y \end{matrix} \right]
实际计算过程中,如果考虑太多高阶的畸变参数,会导致标定求解的不稳定。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
matrix} 2p_1 x y + p_2(r^2 + 2 x^2) \ 2p_1(r^2 + 2 y^2) + 2p_2 x y \end{matrix} \right]
实际计算过程中,如果考虑太多高阶的畸变参数,会导致标定求解的不稳定。
[外链图片转存中…(img-Qq1v3Jaf-1715617449904)]
[外链图片转存中…(img-qZ2InrWr-1715617449904)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新