视觉SLAM14精讲
- 三维空间刚体运动1.0
- 三维空间刚体运动1.1
- 三维空间刚体运动1.2
- 李群与李代数2.1
- 相机与图像3.1
- 相机与图像3.2
视觉SLAM14精讲——相机与图像3.3
- 视觉SLAM14精讲
- 相机投影流程
- 双目相机模型
相机投影流程
至此,有关相机三维刚体变换的所有因素已经汇集。书中对完整的投影过程做了总结。其中主要是将相机投影到世界坐标系。这里我们更进一步,以相机投影到另一个相机为目标,完整推理一遍其中的数学过程,加深对空间的理解。
完整的投影流程如下:
p
2
d
l
⇌
K
l
K
l
−
1
1
Z
l
P
d
i
s
t
o
r
t
e
d
l
⇌
d
i
s
t
o
r
t
u
n
d
i
s
t
o
r
t
1
Z
l
P
3
d
l
⇌
1
Z
l
×
Z
l
P
3
d
l
⇌
T
−
1
⋅
T
⋅
P
3
d
r
.
.
.
p^l_{2d} \xrightleftharpoons[K_l]{K_l^{-1}} \frac{1}{Z^l} P^l_{distorted} \xrightleftharpoons[distort]{undistort} \frac{1}{Z^l} P^l_{3d} \xrightleftharpoons[\frac{1}{Z^l}]{\times Z^l} P^l_{3d} \xrightleftharpoons[ T^{-1} \cdot ]{T \cdot } P^r_{3d} \quad ...
p2dlKl−1
KlZl1Pdistortedlundistort
distortZl1P3dl×Zl
Zl1P3dlT⋅
T−1⋅P3dr...
上式中,左右相机记为上标 l l l和 r r r。 Z Z Z是该点图像坐标对应的深度值。 K K K是内参。 T T T是变换, 等价于左乘旋转矩阵加平移矩阵 R ⋅ ( ⋅ ) + t R \cdot (\cdot) + t R⋅(⋅)+t。 p p p是2D像素点, P P P是3D点云。
要点:
- 这个式子右侧被省略了。以左乘 T T T为对称轴,右侧和左侧是对称的操作,因此这个式子只需要记忆一半。
- 左右的深度值是带下标的,因为左右看到物体的距离不是等价的。
- 左右的内参也分别带下标。 即便左右目是型号一致的两个相机,内参和畸变参数也会不同。
- 如果上式描述了随时间变化位姿的相机,则左右两侧 K K K和 D D D等价。
- 如果你考虑过这个模型, 你会发现他其实可以是双目相机深度的左右转换。 T T T即外参。
当讨论外参的时候,指的就是 T T T或成对的 R , t R, t R,t。一些工程项目中,可能只需要其中一两个参数,但是项目人员仍然将其称为外参。你只需要知道他的本质是外参中的一部分。此外,一定有两个标定的目标出现在讨论话题内, 无论是两个传感器,还是世界坐标系相对一个传感器,外参一定形容的是两个对象之间的空间变换关系。经常有人跟我要外参,而不说明外参所指的另一个对象是什么,让人一头雾水。
双目相机模型
双目相机通过块匹配进行视差估计,然后通过下式计算深度:
d
e
p
t
h
=
f
o
c
u
s
∗
b
a
s
e
l
i
n
e
d
i
s
p
a
r
i
t
y
depth = \frac{focus * baseline}{disparity}
depth=disparityfocus∗baseline
式中,
d
i
s
p
r
a
i
t
y
dispraity
dispraity是视觉计算获得的视差,与彩色图像的分辨率一一对应。OpenCV中有块匹配的具体算法实现,常用的传统算法SGBM。通过构建sgbm对象进行视差的计算。
cv::StereoSGBM sgbm;
sgbm.preFilterCap = 63;
int SADWindowSize=11;
int cn = 1;
sgbm.SADWindowSize = SADWindowSize > 0 ? SADWindowSize : 3;
sgbm.P1 = 4*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;
sgbm.P2 = 32*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;
sgbm.minDisparity = 0;
sgbm.numberOfDisparities = 32;
sgbm.uniquenessRatio = 10;
sgbm.speckleWindowSize = 100;
sgbm.speckleRange = 32;
sgbm.disp12MaxDiff = 1;
sgbm(left , right , left_disp_);
sgbm(right, left , right_disp_);
该算法对cpu计算量的压力很大,因此建议降采样计算。然而这种方案不能应对纹理缺乏的场景,有厂商,例如intel,会采用红外结构光发射器。通过红外摄像头对缺乏纹理区域的斑点进行匹配,然后生成深度。然后在通过文章开头讲的外参变换过程,将两个红外摄像头产生的深度数据投影到彩色摄像头上。配合彩色摄像头的颜色,此时深度就能够进行立体建模。