OpenMVG & OpenMVS 在 Linux Ubuntu 18.04 版本中的安装与使用问题解决方案

Q1.在OpenMVG过程中,根据工程BUILD.md安装到下述代码的时候,报错如下图所示:

$ cmake –build . –target install

OpenMVG & OpenMVS 在 Linux Ubuntu 18.04 版本中的安装与使用问题解决方案_第1张图片

openMVG/multiview/CMakeFiles/openMVG_multiview.dir/build.make:134: recipe for target 'openMVG/multiview/CMakeFiles/openMVG_multiview.dir/rotation_averaging_l1.cpp.o' failed

make[2]: *** [openMVG/multiview/CMakeFiles/openMVG_multiview.dir/rotation_averaging_l1.cpp.o] Error 1

CMakeFiles/Makefile2:2696: recipe for target 'openMVG/multiview/CMakeFiles/openMVG_multiview.dir/all' failed

make[1]: *** [openMVG/multiview/CMakeFiles/openMVG_multiview.dir/all] Error 2

Makefile:149: recipe for target 'all' failed

make: *** [all] Error 2

A1.

此问题在issues中有看到有遇到过同样问题的,作者解答是因为使用本地ceres并且使用了一些在OpenMVG中未开启的CXX standard。作者的建议是将OpenMVG中的C++11换成C++14,因为Integer_sequence是C++14的特性。但是该方法(单纯修改CMakeLists)不能解决问题。

后又经过多番查询,发现可能是gcc/g++版本问题。

通过gcc -v命令,我们获知本地版本为4.8.5,版本过于老旧,可能就是问题所在。于是我们选择安装gcc-7来解决问题(版本7证实在mac OS下与OpenMVS配合甚好)

但是由于是公用服务器环境,不能升级gcc版本,但是通过查看gcc安装目录

ls /usr/bin/gcc*

发现该服务器上安装了许多gcc版本,所以我们最后的解决方案是切换gcc/g++版本,直接切换方式如下:

(若没有安装,可使用命令

sudo apt-get install gcc-4.4 gcc-4.4-multilib g++-4.4 g++-4.4-multilib

完成安装)

输入命令:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 30

请注意最后一个数字代表的是优先级

然后接着输入

sudo update-alternatives --config gcc

计算机跳出如下选项:(此处仅做示范,实际选项信息可能有所出入)

有 3 个候选项可用于替换 gcc (提供 /usr/bin/gcc)。

选择 路径 优先级 状态
* 0 /usr/bin/gcc-4.4 50 50 自动模式
1 /usr/bin/gcc-4.4 50 手动模式
2 /usr/bin/gcc-4.8 40 手动模式
3 /usr/bin/gcc-4.9 30 手动模式

要维持当前值[*]请按回车键,或者键入选择的编号:

选择需要的gcc即可。同理再设置g++的。设置完成后,重新编译,顺利完成。

Q2.OpenMVS安装完成后,bin目录下没有看见Viewer

A2.

这是因为在根据BUILD.MD安装过程中,忽略了作者标记为Optional的部分软件的安装,后来补充安装GLFW3后,重新编译,Viewer成功出现。

Q3.在执行RefineMesh、TextureMesh过程中,跳出已杀死。程序运行自动中断。

通过查询中断命令

dmesg | egrep -i -B100 'killed process'

查询发现是系统自动杀进程(Out of memory),通过进一步查询,得知了Linux系统存在OOM保护程序:一旦某个程序在短时间内大量占有内存至可使系统接近崩溃边缘时,系统直接将其杀死。但是程序还是得跑,有部分网友通过关闭OOM解决了问题,通过尝试,发现该操作及其凶险,有可能会导致不可逆转的错误,不建议轻易尝试。

后来查询程序原代码,发现在RefineMesh.cpp和TextureMesh.cpp中,有限制图像分辨率的选项

resolution-level

该选项意思是在进行RefineMesh/TextureMesh前,要以多少倍来缩小图片尺寸。通过实际测试,只需要以1倍进行缩小就不会被系统杀死进程。因此,我们以

./RefineMesh -- resolution-level 1 scene_dense_mesh.mvs

来执行命令即可。

你可能感兴趣的:(计算机视觉,计算机视觉)