openmvs安装流程及报错解决方法

依赖项

OpenMVS 依赖的几个开源库,有两个是可选的可以先不安装。

1. OpenCV version 4.5.2 or higher (注意:opencv 4.5.2版本需要的Eigen3版本为3.3.7,在安装opencv时需先安装Eigen3.3.7版本,opencv安装完成后再将Eigen3.3.7版本卸载,安装Eigen3.2版本,满足openmvs安装要求)
2. Eigen version 3.2 (or higher on Windows only)
3. Ceres version 1.10 or higher (可选)
4. CGAL version 4.2 or higher
5. Boost version 1.56 or higher
6. VCG
7. GLFW(可选)

工具

1. CMake
2. git
3. gcc 6 、 g++ 6 (gcc 5以上的版本才能完全支持C++11标准,gcc版本过低会报错)

Linux编译

系统版本:Ubuntu 16.04

opencv4.5.2安装参考:在Ubuntu18.04中安装OpenCV4.5

#准备一个空闲的机器安装:
sudo apt-get update -qq && sudo apt-get install -qq
sudo apt-get -y install git cmake libpng-dev libjpeg-dev libtiff-dev libglu1-
mesa-dev
#安装Eigen (必需)
git clone https://gitlab.com/libeigen/eigen.git --branch 3.2
mkdir eigen_build && cd eigen_build
cmake . ../eigen
make && sudo make install
cd ..
#安装Boost (必需)
sudo apt-get -y install libboost-iostreams-dev libboost-program-options-dev
libboost-system-dev libboost-serialization-dev

#安装CGAL (必需)
sudo apt-get -y install libcgal-dev libcgal-qt5-dev
#安装VCGLib (必需)
git clone https://github.com/cdcseacave/VCG.git vcglib
sudo cp -r /home/用户名/vcglib/vcg /usr/include 
sudo cp -r /home/用户名/vcglib/wrap /usr/include
#安装Ceres (可选)sudo apt-get -y install libatlas-base-dev libsuitesparse-dev
git clone https://ceres-solver.googlesource.com/ceres-solver ceres-solver
mkdir ceres_build && cd ceres_build
cmake . ../ceres-solver/ -DMINIGLOG=ON -DBUILD_TESTING=OFF -DBUILD_EXAMPLES=OFF
make -j2 && sudo make install
cd ..
#安装GLFW3 (可选)
sudo apt-get -y install freeglut3-dev libglew-dev libglfw3-dev
#安装OpenMVS
git clone https://github.com/electech6/openMVS_comments.git openMVS
mkdir openMVS_build && cd openMVS_build
cmake . ../openMVS -DCMAKE_BUILD_TYPE=Release -DVCG_ROOT="/path to vcglib/vcglib"
#其中“/path to vcglib/ vcglib”需要改为vcg库的实际文件位置,此外,还需将CmakeCache.txt中两项vcg库地址改为vcg库实际文件地址。

#如果想生成共享库,可以在cmake加如下命令:
#-DBUILD_SHARED_LIBS=ON
#生成 OpenMVS 库文件:
sudo make -j2 && sudo make install

安装报错及解决方法

若你已按上面的版本配置进行openmvs的安装,后面的报错可能不会遇到,下面是我安装过程中遇到的报错及解决方法。

1. cmake编译openmvs时,提示vcg 库缺失

解决方法参考:安装openmvs时 提示vcg库找不到

2. make生成openmvs库文件时,fatal error: codecvt: No such file or directory.

解决方法参考:make编译时fatal error: codecvt: No such file or directory解决方法

3.make生成openmvs库文件编译报错03

/home/用户名/openMVS/libs/Common/Types.h:664:1: error: body of constexpr function ‘constexpr int SEACAVE::log2i(int)’ not a return-statement

报错部分程序代码:

constexpr int log2i(int val) {
	int ret = -1;
	while (val > 0) {
		val >>= 1;
		ret++;
	}
	return ret;
}

C++11中的constexpr指定的函数返回值和参数必须要保证是字面值,而且必须有且只有一行return代码,这给函数的设计者带来了更多的限制,比如通常只能通过return 三目运算符+递归来计算返回的字面值。
参考资料:C++11/14 constexpr 用法
C++11标准下:
constexpr函数使用前必须有对应的定义语句;
constexpr函数中return语句中不能赋值;
return返回的表达式必须是常量表达式,除了形参外不能含有其他变量;
只能包含一条return返回语句,constexpr函数必须有返回值,即返回类型不能是void。

分析代码功能,发现其是求形参变量val的二进制位数减一,因此改成以下代码:(其实这里不用修改程序代码,由C++11/14 constexpr用法可知,constexpr函数在C++14标准下,要求较低,因此只需找到make编译相关的makefile文件,在其中的c++标准设置信息中改为-std=c++14即可)

constexpr int log2i(int val) {
           return floor(log(val)/log(2)+1);

}

然后成功编译,不再报错。

4.make生成openmvs库文件编译报错04

/home/xie/openMVS/libs/Common/Types.h:1483:70: error: ‘cv::Matx_DivOp’ has not been declared

查询资料:三维重建】Ubuntu16.04安装Colmap+OpenMVS注意事项(踩坑记录),提到该问题是opencv版本太低导致的,其推荐opencv-4.5.2版本。
查询opencv版本为2.4.9.1,卸载opencv 2.4.9.1版本,安装opencv 4.5.2。
opencv 4.5.2要求Eigen的版本为3.3.7,需先将Eigen3.2.10卸载,安装Eigen3.3.7,完成对opencv-4.5.2的安装,再将Eigen3.3.7卸载,安装Eigen3.2.10,满足openmvs的安装要求。
然后成功编译,不再报错。

5.make生成openmvs库文件编译报错05

/home/xie/openMVS/libs/MVS/Mesh.cpp:44:33: fatal error: vcg/complex/complex.h: 没有那个文件或目录
 #include 
                                 ^
compilation terminated.
libs/MVS/CMakeFiles/MVS.dir/build.make:127: recipe for target 'libs/MVS/CMakeFiles/MVS.dir/DepthMap.cpp.o' failed
make[2]: *** [libs/MVS/CMakeFiles/MVS.dir/DepthMap.cpp.o] Error 1
make[2]: *** 正在等待未完成的任务....
libs/MVS/CMakeFiles/MVS.dir/build.make:177: recipe for target 'libs/MVS/CMakeFiles/MVS.dir/Mesh.cpp.o' failed
make[2]: *** [libs/MVS/CMakeFiles/MVS.dir/Mesh.cpp.o] Error 1
CMakeFiles/Makefile2:391: recipe for target 'libs/MVS/CMakeFiles/MVS.dir/all' failed
make[1]: *** [libs/MVS/CMakeFiles/MVS.dir/all] Error 2
Makefile:129: recipe for target 'all' failed
make: *** [all] Error 2

分析认为是vcg库不在默认的include文件导致查找vcg的头文件失败。

sudo cp -r /home/用户名/vcglib/vcg /usr/include 

将vcg库文件复制到/usr/include文件夹内后,解决报错。

6.make生成openmvs库文件编译报错06

/home/xie/openMVS/libs/MVS/../Common/Types.h:656:1: error: body of constexpr function ‘constexpr T SEACAVE::powi(T, int) [with T = double]’ not a return-statement
 }

与报错3一样,还是C++11中的constexpr函数规定限制,该函数具体如下所示:

template<typename T>
constexpr T powi(T base, int exp) {
	T result(1);
	while (exp) {
		if (exp & 1)
			result *= base;
		exp >>= 1;
		base *= base;
	}
	return result;
}

从Makefile中MVS安装语句可发现如下信息:

$(MAKE) -f libs/MVS/CMakeFiles/MVS.dir/build.make libs/MVS/CMakeFiles/MVS.dir/build

从build.make可发现:

# Include any dependencies generated for this target.
include libs/MVS/CMakeFiles/MVS.dir/depend.make

# Include the progress variables for this target.
include libs/MVS/CMakeFiles/MVS.dir/progress.make

# Include the compile flags for this target's objects.
include libs/MVS/CMakeFiles/MVS.dir/flags.make

猜测通过修改flags.make中的信息,可以使make采用从C++14标准进行编译。

-include /home/xie/openMVS_build/libs/MVS/cotire/MVS_CXX_prefix.hxx -std=c++11

将flags.make文件中的该语句改为:

-include /home/xie/openMVS_build/libs/MVS/cotire/MVS_CXX_prefix.hxx -std=c++14

修改后解决报错。

7.make生成openmvs库文件编译报错07

In file included from /home/xie/openMVS/libs/MVS/Mesh.cpp:44:0:
/usr/include/vcg/complex/complex.h:39:27: fatal error: wrap/callback.h: 没有那个文件或目录
 #include 

报错:头文件wrap/callback.h缺失。
查询资料vcglib库的入坑体验(读取obj文件并显示),发现wrap/callback.h在vcglib文件夹下,类似问题5将vglib文件夹下的wrap文件夹复制到/usr/include文件夹内。

sudo cp -r /home/xie/vcglib/wrap /usr/include

解决报错。

8.make生成openmvs库文件编译报错08

from /home/xie/openMVS/libs/MVS/Mesh.cpp:44:
/usr/include/vcg/math/matrix44.h:33:31: fatal error: eigenlib/Eigen/Core: 没有那个文件或目录
 #include 

仍然是头文件的缺失。

cd /usr/include
ls

发现有eigen3文件夹

cd eigen3
ls

发现有Eigen文件夹

cd Eigen
ls

发现Core文件。
由此可知,应将

#include 

改为

#include 

修改对应文件中代码

cd /usr/include/vcg/math
sudo gedit matrix44.h

#include 
#include 

改为

#include 
#include 

解决问题。

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