双目相机模型
近期想研究一下 双目相机 的内容,故先把 理论 弄清楚!
一、双目相机模型
针孔相机模型描述了 单个相机 的成像模型。然而,仅根据一个像素,我们是无法确定 这个空间点的具体位置的。
这是因为,从相机光心到归一化平面连线上的所有点,都可以 投影至该像素上。只有当 P
的深度确定时(比如通过双目或
RGB-D
相机),
我们才能确 切地知道它的空间位置。
测量像素距离(或深度)的方式有很多种,像人眼就可以根据左右眼看到的景物差异 (或称视差)来判断物体与我们的距离。
双目相机的原理亦是如此。通过同步采集左右相机的图像,计算图像间视差,来估计每一个像素的深度。
下面我们简单讲讲双目相机的成像 原理(图 5-6 )
双目相机一般由左眼和右眼两个水平放置的相机组成(前期需要标定)。当然也可以做成上下两个目
, 但我们见到的主流双目都是做成左右的。
在左右双目的相机中,我们可以把两个相机都看 作针孔相机。它们是水平放置的,意味两个相机的光圈中心都位于
x
轴上。
它们的距离称 为双目相机的 基线
(
Baseline,
记作
b
),是双目的重要参数。 现在,考虑一个空间点
P
,它在左眼和右眼各成一像,记作
PL, PR
。
由于相机基线的 存在,这两个成像位置是不同的。理想情况下,由于左右相机只有在 x
轴上有位移,因此
P
的像也只在
x
轴(对应图像的
u
轴)上有差异 (
y轴相等
)。
我们记它在左侧的坐标为
uL
,右侧坐标 为 u
R
。那么,它们的几何关系如图
5-6
右侧所示。
根据三角形
P -PL -PR
和
P -OL -OR
的相似关系,有:
稍加整理,得:
这里
d
为左右图的横坐标之差,称为
视差
(
Disparity
);根据视差,我们可以估计一 个像素离相机的距离;f,b 都是已经知道的!
视差与距离成反比:视差越大,距离越近
。同时,由于视差最小为 一个像素,于是双目的深度存在一个理论上的最大值,由 fb
确定。
我们看到,当基线越长 时,双目最大能测到的距离就会变远;反之,小型双目器件则只能测量很近的距离。 虽然由视差计算深度的公式很简洁,
但视差 d 本身的计算却比较困难。我们需要确切 地知道左眼图像某个像素出现在右眼图像的哪一个位置(即对应关系),
这件事亦属于“人 类觉得容易而计算机觉得困难”的事务。当我们想计算每个像素的深度时,其计算量与精 度都将成为问题,
而且只有在图像纹理变化丰富的地方才能计算视差。由于计算量的原因, 双目深度估计仍需要使用 GPU
或
FPGA
来计算。
二、理解
从上面的相机模型可知,要想求出特征点的深度(距离),需要知道特征点在 左右 两个相机 成像平面坐标系下的位置
uL
, u
R;
目前我知道的有两种方法;
第一种:根据模型分别求特征点在左右相机的位置,然后进行匹配,并去除错误匹配点,根据得到的匹配点进行特征点距离的求解;
第二种:根据相机模型,获得特征点在左相机的像素位置,然后根据KLT光流法追踪 左相机特征点 在 右相机的位置,得到匹配的特征点,再进行 三角化!
左相机 右相机
K 帧 prev_img
|
K+1 帧 cur_img ------> rightImg
----------------------------------------------------------------
思考:
想一下VINS-MONO程序的思路,单目+IMU;对于单目相机而言,
需要通过不同位置对同一个路标点进行观察,从观察到的位置推断路标点的距离;
在此之前,需要利用
2D-2D 对极约束 估计两帧图像的旋转和平移;得到特征点后,再利用3D-2D的思路求解相机的位姿;本人感觉求出特征点的距离后,
其他的内容应该别无二致,优化、滑动窗口等;
对于相机运动的估计,可总结如下:
1.
当相机为单目时,我们只知道
2D
的像素坐标,因而问题是根据
两组
2D
点
估计运 动。该问题用对极几何
来解决
2. 当相机为双目、RGB-D
时,或者我们通过某种方法得到了距离信息,那问题就是根 据两组
3D
点
估计运动。该问题通常用
ICP
来解决
3. 如果我们有 3D
点和它们在相机的投影位置,也能估计相机的运动。该问题通过
PnP 求解
双目+imu的作用是什么呢?
(1)追踪中提供较好的初始位姿
(2)提供重力方向
(3)提供一个时间误差项以供优化