视觉SLAM14精讲——相机与图像3.1
视觉SLAM14精讲
- 三维空间刚体运动1.0
- 三维空间刚体运动1.1
- 三维空间刚体运动1.2
- 李群与李代数2.1
- 相机与图像3.1
视觉SLAM14精讲——相机与图像3.1
- 视觉SLAM14精讲
- 简介
- 相机模型
- 内参K
简介
相机是VSLAM中的核心传感器。本章知识点内容涉及到相机相关的知识以及3D计算视觉的一些基础内容。技术栈涉及到相机内外参的标定,投影,以及三维重建。
相机模型
内参K
K
=
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
\begin{equation} K = \left[\begin{array}{ccc} f_x & 0 & c_x \ 0 & f_y & c_y \ 0& 0& 1\end{array} \right] \end{equation}
K=
fx000fy0cxcy1
在忽略畸变的情况下,相机平面中的点,需要转换成列向量,乘以内参的逆
K
−
1
K^{-1}
K−1, 就可以将其转换为空间坐标。但要注意,此时的空间坐标是以
z
z
z坐标进行归一化了的。同样的,空间中的点,对
z
z
z轴归一化以后,乘以内参
K
K
K就可以转换到图像空间。
P
3
D
=
K
−
1
Z
u
,
v
P
2
D
=
K
−
1
Z
u
,
v
(
u
v
1.0
)
P
2
D
=
K
1
z
P
3
D
=
K
1
z
(
x
y
z
)
\begin{align} P_{3D} &= K^{-1} Z_{u, v} P_{2D} = K^{-1} Z_{u, v} \left( \begin{array}{ccc} u \ v \ 1.0 \end{array} \right)\ P_{2D} &= K \frac{1}{z }P_{3D} = K \frac{1}{z }\left( \begin{array}{ccc} x \ y \ z \end{array} \right)\ \end{align}
P3DP2D=K−1Zu,vP2D=K−1Zu,v
uv1.0
=Kz1P3D=Kz1
xyz
- 三维点投影二维点,只需要坐标本身和内参即可计算获得。因此,式(2)中的
z
z
z
z
- 相反的是,二维点不包含尺度因子,因此在恢复三维点的时候,需要额外的尺度因子作为补充。这里的尺度因子,就是常提到的深度 。式(1)中的
Z
u
,
v
Z_{u, v}
u
,
v
u, v
式(1,2)反映只考虑一个这样的点进行内参计算的操作。意味着这样的操作需要重复
w
×
h
w imes h
w×h次。每个像素对应的深度值不同,才能够恢复出物体的结构。如若全部采用同一个深度值,则投影物体会变成一个“纸片”。或者干脆忽略深度因子,所重建的物体会在一米处形成一个“纸片”。
需要乘以深度信息揭示,内参矩阵中的焦距参数
f
x
,
f
y
f_x, f_y
fx,fy的单位并不是网上所谓的
p
i
x
e
l
m
m
\frac{pixel}{mm}
mmpixel或者其他带有实际物理距离的转换量纲,而是归一化的单位
p
i
x
e
l
1.0
\frac{pixel}{1.0}
1.0pixel。
此处的中心点坐标
c
x
,
c
y
c_x, c_y
cx,cy,是张正友标定法确定的投影中心坐标。如果单纯是图像中心坐标其实是不需要计算的。因此不能够简单用图像中心坐标当作内参的中心坐标。以上提到的所有参数,包括畸变参数,都随着相机芯片和固定了的镜头所确定。镜头动、芯片换,内参就需要重新进行标定。同一个内参,即便是同款相机也不能混用,必须做到一机一内参。相机镜头被意外触动,理论上必须重新进行内参标定。
还有一种情况。在相机的日常使用过程中,还会遇到的一种情况是改变相机分辨率。可能下意识会觉得需要重新标定内参K。其实这时候内参只需要和图像保持同样的缩放比即可, 但是
K
[
3
,
3
]
K[3,3]
K[3,3]仍要保持等于1。
img2x = cv2.resize(img, (0,0), fx=2, fy=2)
K = K * 2
K[2, 2] = 1
img0_5x = cv2.resize(img, (0,0), fx=0.5, fy=0.5)
K = K * 0.5
K[2, 2] = 1
- 另一些情况下,我们希望在即便矫正以后,图像仍能够保持相同的内参K参数,需要在opencv矫正畸变接口中,设定输出的内参参数,一般与矫正畸变前保持一致。
cv2.undistort(img, camera_matrix, K, K) #K.保持一致
cv2.initUndistortRectifyMap(K, D, R, K, (w,h), mapx, mapy) #K保持一致