极线:
-
三维点 PPP、左图像中心 CCC、右图像中心 C′C'C′ 构成一个平面,叫做极平面(epipolar plane)。
-
极平面与左图像平面、右图像平面分别相交,交线就是左图像和右图像中的极线。
-
所以,极线是极平面与图像平面的交线。
立体矫正:
对两幅图像做变换,最终使得两幅图像的极线平行,且在水平方向对齐。 这样,当我们需要搜索对应的匹配点时,就只需要在水平方向上进行一维搜索
实现:
在具体实施中,我们假设已经通过相机的几何参数标定(见文章67. 三维重建2——相机几何参数标定)获得了两个相机的内参和外参(K,R,T),并且已经对图像进行了畸变校正。那么,整个校正过程可以总结如下:
注意:
1.算法本身没有考虑图像的镜头畸变,因此使用时需要先对图像点做畸变校正
2.要注意原始相机之间的排布方式。如果相机之间是纵向排列的,需要先把图像旋转到水平,才能进行水平的极线校正对齐。
3.整个算法非常依赖于准确的内参、外参。如果这些信息有误差,最终校正后的极线就不一定能水平对齐了。
立体匹配:
校正后的一对图像获取到视差图的过程,叫做立体匹配。左图上的某个点,要求算法在右图上找到它对应的投影点,然后将两个点的横坐标相减得到该点的视差。
立体匹配的基本思路和流程:
1.图像预处理:
两幅图像的亮度、噪声不一致,一般会先对图像做预处理,使得两幅图像的整体质量区域一致。
census transform :一种特征描述子,描述像素周围邻域的灰度相对关系,作为该像素的特征
census transform方法:
2.代价计算 Cost Computation
两个方式:
- 换用更鲁棒的单像素的代价函数
- 采用邻域支持窗来计算整体代价(常用)
把单个像素的计算转换为一个支持窗内的所有像素整体计算。
一些简单代价函数:
截断绝对差值(Truncated Absolute Difference)TAD
对于左图和右图中两个匹配像素,计算它们灰度值的差值,如果差值太大,就用一个固定值进行截断。
STAD(Sum of Truncated Absolute Differences)截断绝对差值之和
在一个像素邻域窗口中,计算每对匹配像素的截断绝对差,然后求和
WTA(Winner Takes All,意为“赢者通吃”)是立体匹配中从代价立方体中选取最佳视差值的一个非常经典、简单而直观的策略。
代价立方体(cost volume):将reference面中的每个点在target图中的候选像素匹配点(不同视差)进行代价值计算,并将代价值储存在一个立方体中。
固定支持窗,英文是Fixed Window,简称FW。(常用矩形)(存在一些问题,具体见原文)
3.1代价聚合(Cost Aggregation)
局部聚合思路是通过对代价立方体中同一视差的代价进行某种程度的聚合,来减少或消除错误代价的影响,这一步就是所谓的代价聚合(Cost Aggregation)。
3.3.2 视差优化(Disparity Optimization)
(全局优化思路),希望寻找到每个像素的最优视差结果,使得全局的、整体的匹配代价最小,这一步被称为视差优化(Disparity Optimization)。于是这个过程就变成了一个最优化某个能量函数的过程,该函数通常写成如下的形式:
4.视差后处理(Disparity Refinement)
亚像素插值:我们上面计算的视差值都是离散的整数值,但实际场景物体存在连续变化的视差,我们希望得到以浮点数表示的更精细的视差值。一般来说,会采用某种二次的抛物线插值法,得到连续的视差值,计算量也比较低,结果也不错。
噪声和错误消除:有时候会简单采用图像滤波的技术来处理视差图,也能得到不错的结果。从简单的中值滤波,到复杂的双边滤波都有人尝试。
一个重要的技巧是双向匹配,这种方法分别以双目图像中左图和右图作为参考图像R计算两个视差图(缺点:增加了计算量)。然后它认为一对匹配点的视差值是互反的,也就是说一对正确匹配点的视差值会非常接近。如果不满足这个条件那么对应的视差值应该就是错误的。比如下面红色点的视差就计算错误了,而绿色点则是正确的。