在Ubuntu18.04上配置安装了openMVG和openMVS两个库,成功跑通了官方数据集,想看一下它们在其它数据集上的效果,看了很多博客仍然会有错误,所以写一下自己的重建步骤和遇到问题的解决办法。
我选取的数据集是瑞典隆德大学发布的数据集中的圆顶教堂。图像使用佳能NIKON D60(相机型号与参数:Nikon D60;23.6)单反相机拍摄。
注:若电脑内存不够多或显卡不够强,不建议用很大的数据集,不然可能会出现内存不足或时间过长的情况。之前我跑很大的数据集,图片压缩包有1.3GB,稠密化后的文件差不多有20个GB,跑了4个小时最后还有错误,这个圆顶教堂的数据集压缩包只有50MB,很快就跑完了。
我是在一个全新的Ubuntu18.04上配置的openMVS与openMVG,全程按照官方的步骤进行的,参考链接如下:
openMVS:https://github.com/cdcseacave/openMVS/wiki/Building#linux-compilation
openMVG:https://github.com/openMVG/openMVG/blob/master/BUILD.md#compiling-on-linux
注:
1、建议先装openMVS再装openMVG,原因:
这两个库都需要用到libjpeg包,若它们编译时用到的libjpeg版本不同,则在稠密化的时候会报错
为避免上述问题,在openMVG cmake之前先去中注释/删除掉以下文字: if (DEFINED OpenMVG_USE_INTERNAL_JPEG) message(STATUS "LIBJPEG (internal)") else() message(STATUS "LIBJPEG (external)") endif()
即下面这段(蓝色字体),这样是为了openMVG不用自己的libjpeg而只用openMVS的libjpeg
若第1个方法不起作用,可以将libjpeg.so.8的路径/usr/local/lib添加到环境变量中,在命令行输入以下命令:echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib' >> ~/.bashrc
这样就不会再出现libjpeg包的问题了。
2、这个算法是需要自己相机的参数的,参数文件为“sensor_width_camera_database.txt”,这个在后续过程中也会提到,主流相机都会在这个文件中写,若其中没有自己的相机型号和参数,可通过以下方法获取(个人认为用焦距来代替参数是不准确的,所以仅在txt中没有该相机的时候用来代替):
I 在图片的属性中找到相机型号和焦距,焦距即为参数
II 手机的话下载AID64这个应用,这里面<设备>这项,查看焦距即可例如我的手机是华为p20pro,相机型号为CLT-A10,焦距为5.58,则在txt中输入“CLT-A10;5.58”
1、首先下载该数据集,将文件夹解压到SfM目录下的dataset文件夹(自己建的,方便管理数据集)中,进入eglise文件夹,把图片放入image文件夹,新建result文件夹
< image >:放置照片的文件夹;
< result >:输出的文件夹;
image存储输入的图片,result存储输出的数据文件
2、读入图像,产生数据文件,SFM文件夹下,终端输入:
openMVG_main_SfMInit_ImageListing -i dataset/eglise/image -o dataset/eglise/result/matches -d /home/lianqi/openMVG/src/openMVG/exif/sensor_width_database/sensor_width_camera_database.txt
执行成功后在matches文件夹产生sfm_data.json文件
注意!!!
“sensor_width_camera_database.txt” 是openMVG库中自带的,存储各大主流相机型号和参数的文件, “Nikon D60;23.6” 就写在该文件中。
" -d /home/lianqi/openMVG/src/openMVG/exif/sensor_width_database/sensor_width_camera_database.txt"
这条命令必须要写上,这是导入相机参数的,不然会报错
3、ComputeFeatures
openMVG_main_ComputeFeatures -i dataset/eglise/result/matches/sfm_data.json -o dataset/eglise/result/matches
4:ComputeMatches
openMVG_main_ComputeMatches -i dataset/eglise/result/matches/sfm_data.json -o dataset/eglise/result/matches
5:IncrementalSfM
openMVG_main_IncrementalSfM -i dataset/eglise/result/matches/sfm_data.json -o dataset/eglise/result/out_Incremental_Reconstruction -m dataset/eglise/result/matches
注:若这条命令或之后的命令出现没有找到图片或无法加载图片,例如:
error: failed reloading image ‘/home/lianqi/openMVG_Build/software/SfM/dataset/eglise/result/out_Incremental_Reconstruction/undistorted_images/DSC_0430.JPG’
则说明进入的文件夹太深了,图片并不在这层文件夹内,可以cd . .两次再执行
6:ExportUndistortedImages
openMVG_main_ExportUndistortedImages -i dataset/eglise/result/matches/sfm_data.json -o dataset/eglise/result/out_Incremental_Reconstruction/undistortedimage
7:数据格式转换
openMVG_main_openMVG2openMVS -i dataset/eglise/result/out_Incremental_Reconstruction/sfm_data.bin -o dataset/eglise/result/out_Incremental_Reconstruction/scene.mvs
sence.mvs即为openMVG生成的稀疏点云文件
OpenMVS的使用基础为openMVG生成的稀疏点云
之后的步骤就是用openMVS的终端工具对点云进行处理,这些终端工具一般在下,直接使用会找不到,所以必须使用绝对路径
稠密点云重构:使用终端工具 DensifyPointCloud 建立稠密图
/usr/local/bin/OpenMVS/DensifyPointCloud dataset/eglise/result/out_Incremental_Reconstruction/scene.mvs
执行后会生成scene_dense.mvs与scene_dense.ply文件,scene_dense.ply文件用meshlab查看如下:
若这一步只产生了一个日志文件而并未生成上述文件,一般使用以下两种方法:
1、将scene.mvs改名,比如改成s1.mvs,再次执行此命令即可
2、重启电脑,再次执行此命令
以上两种我都尝试过,亲测有效,但是为什么会有这种bug目前还不知道
网格重构:使用终端工具 ReconstructMesh 建立粗网格
/usr/local/bin/OpenMVS/ReconstructMesh dataset/eglise/result/out_Incremental_Reconstruction/scene_dense.mvs
执行后会生成scene_dense_mesh.mvs,scene_dense_mesh.ply,是带粗纹理的,如下:
网格精炼(可选):使用终端工具 RefineMesh 建立精致网格
/usr/local/bin/OpenMVS/RefineMesh dataset/eglise/result/out_Incremental_Reconstruction/scene_mesh.mvs
网格纹理映射:使用终端工具 TextureMesh 混合网格建立纹理
/usr/local/bin/OpenMVS/TextureMesh scene_dense_mesh.mvs
最终生成的模型如下:
模型不够完整,但是效果还行。图片的数量对重建的效果影响很大,这个数据集图片有点少,有条件的话可以跑一下更大的数据集。
参考链接:
https://blog.csdn.net/qq_42615787/article/details/105609338
https://blog.csdn.net/abccc250110119/article/details/105075101