Ubuntu使用OpenMVG和OpenMVS进行三维重建

三维重建

       我们知道,照相机的原理是讲一个三维场景投影到二维平面。所谓三维重建,顾名思义就是从已有的二维图像中复原原始三维场景。
       三维重建的原理大致如下:首先,通过多角度拍摄或者从视频中提取得到一组图像序列,将这些图像序列作为三维重建系统的输入。然后分析多个视角的图像,根据纹理特征提取出稀疏特征点(稀疏点云),通过这些特征点估计相机位置和参数。在得到相机参数并完成特征点匹配后,就可以获得更稠密的点云(这些点可以附带颜色,从远处看就像还原了物体本身一样,但从近处能明显看出它们只是一些点)。最后根据这些点重建物体表面,并进行纹理映射,就还原出三维场景和物体了。
       目前,有不少开源的三维重建系统,下面这篇文章写出了各个系统的比较:https://leohope.com/解问题/2018/03/06/compare-re3d-system/
       之前尝试用过PMVS-CMVS,后来发现使用的重建方法比较老,源文件已经很久没有更新和维护。而且它支持的输入有很大的局限性。最终,我选用了能够配套使用的完整库OpenMVG和OpenMVS(文档最规范详细),这两个系统虽然不是一个团队开发的,但却恰好一起完成了三维重建的整个流程。

OpenMVG和OpenMVS

       常见的多视图三维重建管线:重建稀疏点云-Structure from Motion(Sfm)→重建稠密点云-Multi-View Stereo(MSV)→重建表面-Surface Generation(SG)→纹理映射-Texture Mapping(TM)

       其中,OpenMVG负责从原始图像到稀疏点云,OpenMVS负责重建稠密点云、重建表面和纹理映射。我这里还使用了Meshlab查看模型(点云)生成效果。

编译过程

编译就像女朋友生气,永远不知道你错在哪里。

OpenMVG

       OpenMVG的编译参考官方文档很顺利的通过了,没踩到坑。

OpenMVS

       还是先上官方文档。
       下面列出几个遇到的坑,供需要的朋友参考。
       官方文档第四行有一句:main_path='pwd'。一开始没在意就照做了,后来在执行这句命令:cmake . ../openMVS -DCMAKE_BUILD_TYPE=Release -DVCG_ROOT="$main_path/vcglib"来编译VCGLib的时候报错说找不到VCG的路径,让我指定环境变量VCG_ROOT的值。想了一下可能是main_path没指定对,后来试了一下将main_path直接替换为VCGLib的根目录就可以顺利通过啦。
       还有一个就是Eigen库的版本问题,当时编译时直接下载了最新版本,后来编译出错,最后在stackoverflow上找到答案,Eigen必须是3.2.X版本。
       其他的按照官方文档都顺利编译通过!编译完成后迫不及待的下载了官方用例一展身手。按照官方文档给的使用教程执行时,Sfm过程很顺利,生成了稀疏点云。但是在后面的MVS过程出现了找不到指令的错误。明明编译过程和Sfm过程都很顺利,为什么会说找不到指令呢?头都要挠秃了,后来去看了一眼用户目录下的bin目录,发现里面根本就没有OpenMVS的指令阿, 难道编译出错了吗?
       在google的时候偶然看到stackoverflow上的一个帖子(万能的stackvoreflow又拯救了我的头发),OpenMVS编译是不会将可执行文件放在用户的bin目录下的,在使用的时候要手动把编译生成的可执行文件复制到用户的bin目录下或者指定文件的目录(OpenMVS_Build/bin),急忙去OpenMVS_Build/bin下面把可执行文件复制到用户的bin目录下,试了一下果然可以了!

小结

       了解了整个流程后,就可以手写脚本来实现整个流程了。最后再给出一个图片数据集网站,可以直接拿图来执行整个三维重建过程:http://www.diegm.uniud.it/~fusiello/demo/samantha/

如有错误还请大牛指正,希望对大家有所帮助。

你可能感兴趣的:(三维重建)