我在文章66. 三维重建1——相机几何模型和投影矩阵和67. 三维重建2——相机几何参数标定中介绍了相机的透视几何模型,以及如何求取这个模型中的各项参数
现在我们来思考一个问题:如果已知某个图像中的点的坐标,如何能够求得它在三维空间中的物点的位置?
由这个问题开始,我今天会讲到几个内容,希望这些内容能给你启发
很显然,由于上图中红色射线上任何一个点X都可以映射到图像上的点x,因此单从这个模型我们是如法确定三维点的确切位置的。要想确定物点的位置,最基础的方案就是对同一个物点用两个相机分别成像,并利用一个叫做“三角测量(Triangulation)”的技术,来进行定位。
三角测量法首先要求我们已知两个相机的相机矩阵P和P',以及一对匹配的图像点x和x',所需要求取的是这对图像点对应的真实物点的坐标。
它的基本思想可以用下图总结出来。
实际上,由于噪声的存在,上面图中两条光线很可能不相交,因此实际求解过程又要用到最优化的技术,下面进行具体的数学分析
首先,我们还是回到基本的模型
这里面,坐标都是齐次坐标,因此尺度是不确定的。关于这一点,你齐次坐标的知识,你可以再看看我在66. 三维重建1——相机几何模型和投影矩阵中的介绍。我们加入这个不确定的尺度,于是有
观察上述等式,我们有x和PX都是3维向量,它们方向一致,只相差一个未知的尺度\alpha。这里,我又提到了“向量”这个也许你已经不再记得很清晰的数学名词了,因此我在下一小节再啰嗦一下向量的一些关键知识,以便于进行后面的推导。
首先,在数学中,向量是具有长度和方向的量。在本文的范畴中,向量可用于表示空间中两个点的方向和距离。
如果我们将向量的长度归一化为1,就会得到单位向量
向量和向量之间是可以进行运算的,我们下面特别介绍向量和向量的点积和叉积:
向量的点积
向量的点积结果是一个数,通常用于确定向量之间的夹角。
由于有了这个定义,确定夹角的余弦只需要做简单的计算即可:
同时,也可以很方便的计算一个向量在另外一个向量上的投影:
根据向量的定义,我们很容易发现,当两个向量的夹角为90度(即两个向量正交)时,两个向量的点积为0,请你记住这一点,待会我们还会用到这个知识。
向量的叉积
上面我们看到,向量的点积结果是一个数。而向量的叉积结果却是一个向量。既然是向量,那么就有长度和方向,下图展示了向量叉积结果的长度和方向。
根据上面的定义,我们知道了最重要的两点:
叉积结果的数学表达略微复杂,但还是可以理解的:
虽然关于向量还有很多知识可以讲,但对今天这篇文章来说,上面这些信息已经足够你理解后面的内容了。我再小结一下:
回到基础的模型
这里,虽然等号左右两边都是表示的点,但从数学上讲我们也可以把任何一个点看做是一个向量。于是,我们看到x和PX是同方向的向量,只是尺度不一样。因为两个方向一致的向量叉积结果是一个长度为0的向量,那么就有:
现在展开基础模型,有
把P的每一行简写,有:
之前讲过叉积的表达式是:
把上面的结论代入到叉积表达式,有:
注意上面式子的第三行其实可以用第1、2行线性组合而成,所以我们可以简写为:
现在结论就很明显了:一对点X->x,提供了两个方程。现在我们有两幅图像,因此我们有四个方程:
由于X中只有3个未知的坐标分量,现在有4个约束方程,所以我们必然可以用最小二乘的方式求得X。而且,在文章67. 三维重建2——相机几何参数标定中,我已经介绍过这种形式的式子的解法了,就是用SVD分解可以直接得到解,在此就不再赘述了。总之,只要知道一对匹配点x和x',已知两个相机的相机矩阵P和P',就能够根据上述方法求得物点X。
既然我们在这一节已经看到了两个相机的作用,接下来我们就进一步分析两个相机成像时,还有哪些几何约束。
当一个三维点通过两个相邻的相机成像时,满足下面的对极几何关系,这里面有几个关键的概念:
这时候,如果物点在图像1的投影点为x,那么在另外一幅图像2中的投影点一定位于极线l'上,如下图所示:
我们又可以进一步得到这个模型中更多的几何性质:
注意上面最后一个性质,极点不一定总是在图像上,比如下面这个场景,极点就在图像之外(依然在图像平面上)。
当两个相机平行时,极点甚至可以位于无穷远处
当我们已知一个图像点,想要搜索它在另外一个图像的对应点时,就可以利用上面讲的对极约束,只在第二幅图像的极线上进行搜索,从而加快搜索速度
这个性质对我之后要讲解的立体匹配非常重要,此处暂且按下不表。但我们不禁要问一个问题:如何才能求得极线?这就引出了我下面要讲解的本质矩阵的概念。
回到我们的基本投影模型,可以看到点X投影到像平面上为x
如果已知x点在像平面上的坐标,根据对极约束,可以通过左乘本质矩阵E来求得右图的极线,如下图所示。注意这里依然用齐次坐标来表达,所以E是一个3x3的矩阵,而l'则用一个3x1的向量来表达。
我们知道,二维空间中的一条直线可以表达为下面的形式:
所以极线可以表示为
现在我们知道图像点x是位于极线l上的,那么很容易得到下面这个结论:
结合上面两点,我们很容易得到另外一个关于本质矩阵的性质:
你在之前可能听说过单应矩阵,我在上一篇文章67. 三维重建2——相机几何参数标定中也提到过单应矩阵。使用单应矩阵能将一个平面图像上的点映射到另外一个平面上,它跟现在讲的本质矩阵的异同我用下图总结:
现在我们来解释一下本质矩阵的由来。由下图可见,我们很容易通过一些简单的变换从点x得到点x'
很容易知道x, t, x'这3个向量是共面的(记住,点同时也代表从坐标原点指向它的向量)
记住我们之前学过的关于向量的几个性质:
那么就有:
把上面的几点整合起来,就有:
之前讲过,向量的叉积可以用“矩阵乘以向量”来表示,因此就有了
本质矩阵是英国科学家Longuet-Higgins在1981年提出的,以上这个等式我们也称作Longuet-Higgins等式。
总结一下本质矩阵的性质
本质矩阵的上述性质的数学公式里面,2D点都是位于相机坐标系的,现在我们再回头看看相机矩阵的各个组成部分,可以看到当我们使用本质矩阵时,默认内参矩阵为单位矩阵,坐标原点位于主点,坐标单位为毫米这样的长度单位。但实际上,我们通常得到的像点都是位于图像像素坐标系的,其左边原点位于图像左上角,坐标单位为像素。这时应该怎么办呢?这就引出了下一节所要介绍的基础矩阵的概念
现在我们把相机坐标系中的坐标转换为像素坐标系中的坐标,这需要用到相机的内参矩阵K,如下图所示。注意这里用了^符号来标明相机坐标系中的坐标:
很容易通过Longuet-Higgins等式得到下面的式子,这就是基础矩阵F的由来:
所有本质矩阵E的性质,基础矩阵都继承了,只不过应用时2D点的坐标位于图像的像素坐标系:
除了上述性质之外,基础矩阵还有一个重要性质,就是它是一个奇异矩阵,其秩为2。这一点很重要,稍后我们会用到这个性质。
因为有
所以基础矩阵里面同时包含了相机的内参数矩阵K和外参矩阵R/t,那么已知像素坐标x和x',我们如何来求基础矩阵呢?
根据基础矩阵的定义,我们会看到每一对匹配点都满足下面的约束关系:
很自然的,我们会想是不是也能像之前一样,把上面这个约束转换为AX=0的线性形式,从而采用SVD来求取结果。所以接下来,我们需要展开上式来观察每一对匹配点,到底提供了什么样的约束。
强行展开上式有:
暴力采用矩阵乘法的定义,我们会看到一对匹配点提供了1个约束等式,注意等号左右两边都是标量:
由于F中有9个元素,最后一个元素和前面8个元素有线性约束关系,所以我们一共需要求解8个未知数,于是我们至少需要8对匹配点,构建8个方程:
这个式子又是我们熟悉的AX=0的形式,再加上约束项,就变为下面这个最优化问题,这样就可以用SVD来求解了,神奇吧~
正如我在文章67. 三维重建2——相机几何参数标定中所描述的,我们现在采用的方法是一种DLT方法,而这种方法在实际使用时需要首先对数据进行归一化。那么实际求解F的过程就变成了(我们假设两个图像的匹配点已经求出):
正如我在上一篇文章中所说,8点法这样的DLT方法只是最优化了代数距离,它的结果是不够好的,一般来说是用于设定非线性迭代式优化方法的初始值。由于篇幅原因,我这里就不再介绍通过非线性方法求解基础矩阵的完整过程了,但其基本原理和上一篇文章67. 三维重建2——相机几何参数标定中介绍的相机标定时的核心思想是一致的。另外计算的结果很容易收到匹配点的误差的影响,因此实际计算时需要通过RANSAC这类方法去除掉外点。读者可以阅读《计算机视觉中的多视角几何》一书的11.4节至11.6节了解详情。
下面我们看到了同一个场景用两个相机成像的结果,你可以看到它们的视角差异很大
你可以尝试用上述的方法来求取基础矩阵。如果我们知道了基础矩阵,很容易求得其对应的极线。下面给出具体的数据:
将对应的极线可视化,我们有:
按照这种方法,找出两幅图像上很多极线,并可视化如下:
你可以看出,第1幅图的很多极线相交于图像外的某处——也就是说它的极点位于图像外。定位极点也很容易,因为Fe=0, 所以只需要对F进行SVD分解就可以得到e,你可以试试。
在上一篇文章67. 三维重建2——相机几何参数标定中,我们已经求得了相机矩阵P,并分解得到了内、外参。今天延续上一篇文章,我讲解了下面几部分内容:
因为篇幅原因,我省掉了如何通过非线性最小二乘法自动的求解基础矩阵的过程。总而言之,有了基础矩阵,就可以求取对极几何约束中的一些关键信息了,这也就为我之后讲解图像的立体校正和立体匹配打下了基础,敬请期待我的下一篇文章!