从单幅图,到两幅图甚至多幅图,计算机视觉正在完成越来越多不可思议的事情。今天的主角——
对极几何,通常用来解决双眼匹配搜索对应点的问题。近几年大火的视觉里程计,就离不开它的身影,老规矩,我们还是先了解下几个基本概念:
一、基础矩阵
反映空间一像素点P在不同视角相机拍摄下图像坐标系中的对应关系。

假设相机#1,#2的中心分别为
O_1,
O_2,存在一个矩阵
F,使得空间中不在两图像平面上的任一点
X分别在两图像的投影坐标
x,x^{‘}满足等式
(x’)T×F×x=0,即
x’的转置乘以F,再乘以x的结果为0,那么F就是左边图像到右边图像的基础矩阵,从公式上可以看出基础矩阵是有方向的,右图到左图的基础矩阵就是F的转置。
基础矩阵提供了三维点到二维的一个约束条件,举个例子,现在假设我们不知道空间点
X的位置,只知道
X在左边图上的投影
x的坐标位置,也知道基础矩阵,首先我们知道的是
X一定在射线
O_1x上,到底在哪一点是没法知道的,也就是
X可能是
O_1x上的任意一点(也就是轨迹的意思),那么
X在右图上的投影肯定也是一条直线。也就是说,如果我们知道一幅图像中的某一点和两幅图的基础矩阵,那么就能知道其对应的右图上的点一定是在一条直线上,这样就约束了两视角下的图像中的空间位置一定是有约束的,不是任意的。
二、本质矩阵
反映空间一像素点P在不同视角相机拍摄下相机坐标系中对应关系。

假设相机#1,#2的中心分别为
O_1,
O_2,小白运动到
O_1的时候,X在当前坐标系的坐标为:
x_1 = \vec {O_1X},过了一会儿,它运动到点
O_2,相对于绝对坐标系,自己的坐标系发生了旋转和平移变换:
t= \vec {O_1O_2},此时X在当前坐标系中的坐标变为:
x_2 = \vec {O_2X} = Rx_1 + t, 从图中我们可以看到
\vec {O_1X},
\vec {O_2X},
\vec {O_1O_2}都在同一平面上,这个约束可以通过如下表达式体现:
\vec {O_2X}·(\vec {O_1O_2} × \vec {O_1X}) = 0
三、对极几何
描述两幅视图之间的内在射影关系。

假设相机#1,#2的中心分别为
O_1,
O_2,直线
O_1O_2为基线,
O_1O_2P为对极平面
,对极平面与两相机图像的交线称为对极线
,而O_1 O_2与两图像的交点就是对极点。
1.相机相对位姿估计
1)未知:旋转和平移矩阵
R, t(5自由度)
2)已知:对应点
(x_1,x_1^{‘})…(x_n,x_n^{‘})和相机矩阵
K,K^{‘}
3)限制条件:n x 极性约束
(x^{‘T}Fx=0)
4)解决方法(OpenCV):
- 基础矩阵:7/8点算法(7自由度)
- 估计: cv::findFundamentalMat()
- 转换到矩阵E:$E=K^{‘T}FK$
- 本质矩阵:5点算法
- 估计:cv::findEssentialMat()
- 分解:cv::decomposeEssentialMat()
2.对极几何概览:
有了前面的概念做基础,我们看下以下2个例子:
例子#1:单目视觉里程计
1)通过光流提取得到暂定匹配;
2)去除错误的匹配点;
3)相机相对位姿估计;
4)相机相对位置计算;
以下是部分代码及执行结果:
例子#2:三角化(双视图重建)
三角化(点位置)
1)未知:3D点X的位置(3自由度)
2)已知:点对
(x,x^{‘}),相机矩阵
(K,K^{‘})和相对位置
(R,t)
3)限制条件:2 x 投影矩阵
x= K[I|0]X, x^{‘}=K{‘}[R|t]X
4)解决方法:cv::triangulatePoints()
以下是部分代码及执行结果:
最后,总结下:
1.基础矩阵:反映空间一像素点P在不同视角相机拍摄下图像坐标系中的对应关系。
2.本质矩阵:反映空间一像素点P在不同视角相机拍摄下相机坐标系中对应关系。
3.对极几何:描述两幅视图之间的内在射影关系。