最近也算是三维重建入门了,所以回顾一下自己的学习历程。
结论:目前图像的三维重建都是于相机模型和三角测量实现的(还有一些其他的方法,因为没看过,就先算了)。
三维重建的步骤其实也就是我学习的步骤。
第一步主要是图像处理等相关知识的学习,主要包括图像特征(点,线,任意物体)的提取。其中可以自己动手写写代码的,特别是霍夫变换的任意物体的提取,我自己是写了一遍收益匪浅。当然目前的深度学习也可以学习学习,我在学习sift这篇论文的时候,给我感觉就是深度学习的过程,但是这里的学习是人自己的先验知识,因此基于深度学习的特征点提取我是特别看好的(比如D2-Net)。如果是急于想做出效果,这里只需要学习sift特征提取(opencv里是有代码的)。
第二步就是相机模型的学习。相机模型的学习是了解三维空间点到成像平面二维点的一个映射物理模型,既然是物理模型,就有参数因此需要对相机标定,相机标定是一个比较综合的过程,可以看张正友的平面标定论文,然后自己动手编程实现,标定的最后一步是需要优化的,这里可以补补优化的知识,也可以尝试用ceres做优化,也可以自己写一些bundle adjustment 感受一下矩阵稀疏带来的加速效果。
第三步就是三维重建了。通过前面的相机模型的学习可以看出,在成像的过程深度信息是丢失的。因此常见的结构是双目系统(或者projector-camera system),本质都利用三角化来恢复深度。这里还有一个关键是立体匹配,就是同一空间点在不同图片上的位置。前面说的sift可以提供比较粗劣的效果,为了提高精度一般都是sift匹配提供初始的匹配,接下来还是需要优化的(我学习的有pathmatch)。当然在工业测量中,结构光被用来辅助这种像素匹配,结构光(这里有很多技巧)给每个像素唯一的身份,其实就类似sift但是他更准确,这样用来匹配更加准确,匹配好三角测量就可以得到点云了。
前面说的必须二个相机才能重建其实对也不对,我们也可以让一个相机动起来,这就是structure from motion.这里需要学习一些极线几何的知识,本质矩阵基础矩阵啥的,不要给名字吓到,这些只是表述变量的关系,需要注意的是,这里重建出的物体是缺乏尺度的。
最后这些过程需要对刚体变换熟记于心(本质就是R T),这里对于新手容易混淆。
最后的最后就是这些值得做的点:第一就是高精度的三维重建,第二就是大规模的三维重建,第三是非刚体的structure from motion,第四是动态三维重建。这些方向我觉得都值得做,虽然我一个都不会。