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