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版本过低会报错)
系统版本: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的安装,后面的报错可能不会遇到,下面是我安装过程中遇到的报错及解决方法。
解决方法参考:安装openmvs时 提示vcg库找不到
解决方法参考:make编译时fatal error: codecvt: No such file or directory解决方法
/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);
}
然后成功编译,不再报错。
/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的安装要求。
然后成功编译,不再报错。
/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文件夹内后,解决报错。
/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
修改后解决报错。
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
解决报错。
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
解决问题。