稠密点云重建的三大基石:极线条搜索、光度一致性约束、可视性约束。
极线搜索
在一幅图像中确定一点,在另一幅相邻图像中,也存在与之对应的像素点,而且该点就在另一幅图像的极线中。
对极约束,如下所示:
x1和x2为两像素点,F为基础矩阵,表示相机的旋转和平移。l1和l2表示左极线和右极线。在极线上,进行搜索相对应的像素点,找到与之对应的像素点。再通过三角化,来确定这个像素点的深度。
光度一致性假设
同一空间的点在不同视角的投影应当具有相同的光度,重建的核心在于恢复空间中具有光度一致性的点。
朗伯反射假设:物体表明是朗伯面,从不同的视角去看物体表面,颜色是一样的。
比如:纹理比较均匀的表面,如墙面等,没有强烈光照和阴影的表面,都是朗伯面。
但是,玻璃表面和水面,不是朗伯面。因为它在一个方向上反射的光非常强,在其他方向反射的光非常弱,或者趋近于0。
玻璃建筑或者水面,不能使用光度一致性加速,进行稠密点云重建。也不能进行稀疏点云重建,因为没法进行特征检测。
比如在地形重建的过程中,有一条河,稀疏重建和稠密重建都重建不出来,因为不是朗伯面。
C1图像中的一个点,在另一幅C2图像中做极线搜索,计算C2极线中一点与C1中的点的像素的颜色相似性,判断是不是同一个点。
但是,只考虑一个像素的话,特征是不够强的,因为像素的值变化可能比较剧烈,即使是极线上对应的同一个点,在不同图像上,颜色多少有些差异。不是极线上对应的同一个点,颜色可能会相似。所以,仅用像素的值进行判断,鲁棒性会非常差。
通常,如C1中,以像素Pi1为中心,取一个patch(3*3或5*5),这个patch就是三维中一个非常微小的平面,把这个patch投影到其他视角上,计算patch内一些采样点的颜色,用来做相似性的计算。这样会提高鲁棒性。
以像素为中心取一个patch,是考虑像素的局部特征。这是基于图像方法做点云稠密重建的,普遍方法。
可视性约束
在重建深度时,相邻的点满足可视性约束。
重建出点的深度不能遮挡其他的点
比如物体表面的点为A',而优化计算出的点为A,这个A点就是不可靠的点。
因为从第i个视角,图像中的A'点看不到,但是实际中可以看到A'点。
说明重建的A点是错误的。
重建出点的深度不能位于物体内部
比如重建出的C点,位于物体内部。位于物体内部的话,在每个视角都是不可见的。
如果重建出的C点在每个视角里的NCC值都非常小,那么这个重建出的C点就是错误的。
正常的重建出的点位于物体的表面
正常的重建出的点,一定位于物体的表面,表面上的点可以被相机观察到。
另外它在每个视角里的NCC值都比价高。
比如重建出的B'点,其对应图像中的B点。
这种情况下满足可视性约束:既不遮挡其他的点,也不被其他的点遮挡。