前言
主要介绍OpenMVG的编译,从https://github.com/openMVG/openMVG下载OpenMVG源码,也可以采用git来下载。
一、OpenMVG编译
1.1 安装git,https://git-scm.com/downloads,https://registry.npmmirror.com/binary.html?path=git-for-windows/,OpenMVG需要采用git命令行来更新三方库cereal。打开git cmd,进入到OpenMVG保存路径,执行如下命令。
git clone https://github.com/openMVG.git
cd openMVG
git submodule init
git submodule update
1.2 OpenMVG依赖下载
https://github.com/openMVG/openMVG/tree/develop/src/dependencies,下载OpenMVG的三个依赖库,并解压到OpenMVG/src/dependencies目录下。
二、CMAKE编译
2.1 打开cmake-gui,设置源码目录为openMVG/src目录,并设置一个输出目录为openMVG_build以及安装目录,勾选OpenMVG_BUILD_EXAMPLES、OpenMVG_BUILD_TESTS即可编译。
2.2 点击Configure,直到没有红色条目,在点击Generate即可生成vs工程。
2.3 不同的VS版本,不同电脑编译的错误不同,在VS2015/x64的编译情况中,有些版本的OpenMVG编译并不能通过,本文章采用如下版本编译通过,CMakeLists.txt经过如下修改。
链接:https://pan.baidu.com/s/16AJJ8vNRpCIyF90s2Ap43A
提取码:z5mi
- 注释修改Eigen相关代码;
- 注释掉 find_package(Ceres QUIET HINTS ${CERES_DIR_HINTS})
- 注释掉if (DEFINED OpenMVG_USE_INTERNAL_JPEG)相关语句;
具体改动情况如下:
# ==============================================================================
# Eigen
# ==============================================================================
# - external by default
# - external if EIGEN_INCLUDE_DIR_HINTS is defined
# - internal if Eigen not found
# ==============================================================================
#find_package(Eigen3 QUIET)
#if (NOT Eigen3_FOUND)
set(EIGEN_INCLUDE_DIR_HINTS ${CMAKE_CURRENT_SOURCE_DIR}/third_party/eigen)
set(OpenMVG_USE_INTERNAL_EIGEN ON)
find_package(Eigen QUIET)
#else()
# set(EIGEN_INCLUDE_DIRS ${EIGEN3_INCLUDE_DIR})
#endif()
# ==============================================================================
# Ceres
# ==============================================================================
# - external by default if CERES_DIR_HINTS or find_package found a valid Ceres
# - internal if ceres not found (ceres-solver+cxsparse+miniglog)
# ==============================================================================
#find_package(Ceres QUIET HINTS ${CERES_DIR_HINTS})
if (NOT Ceres_FOUND)
set(OpenMVG_USE_INTERNAL_CERES ON)
set(CERES_INCLUDE_DIRS
${CMAKE_CURRENT_SOURCE_DIR}/third_party/ceres-solver/include
${CMAKE_CURRENT_SOURCE_DIR}/third_party/ceres-solver/internal/ceres/miniglog
${PROJECT_BINARY_DIR}/third_party/ceres-solver/config)
FILE(READ "${CMAKE_CURRENT_SOURCE_DIR}/third_party/ceres-solver/VERSION" CERES_CONFIG)
STRING(REGEX REPLACE "version ([0-9.]+).*" "\\1" CERES_VERSION ${CERES_CONFIG})
set(CERES_LIBRARIES openMVG_ceres)
endif()
# if (DEFINED OpenMVG_USE_INTERNAL_JPEG)
# message(STATUS "LIBJPEG (internal)")
# else()
# message(STATUS "LIBJPEG (external)")
# endif()
2.4 编译错误解决
在有些电脑上仅修改上述CMakeLists.txt即可编译通过,本文在另一台电脑上编译出现的问题及其修改办法如下,经过适当修改,最终成功编译通过并安装。
34>E:\GIS\openMVG\src\openMVG/matching/matcher_hnsw.hpp(157): fatal error C1001: 编译器中发生内部错误。
双击文件定位到文件中,定位到如下代码附近,猜测可能是由于编译器的版本导致的,主要是在并行处理的代码中,因此在camke-gui中将并行的宏取消勾选,取消勾选OPENMVG_USE_OPENMP。
#ifdef OPENMVG_USE_OPENMP
#pragma omp critical
#endif
{
for (const auto & res : result)
{
pvec_indices->emplace_back(i, res.second);
pvec_distances->emplace_back(res.first);
}
}
}
return true;
};
error C2899: 不能在模板声明之外使用类型名称
定位文件中,通过查阅资料可知,是因为在非模板类型中使用了typdename关键字,注释掉 typename 即可
将不能识别的语法简单改写,如下。
将该语句
map_rots[{cur_rotation.i,cur_rotation.j}] = cur_rotation;
改写为:
Pair key = {cur_rotation.i,cur_rotation.j};
map_rots[key] = cur_rotation;
还有一些工程需要添加/bigobj才能编译通过,具体根据错误提示添加即可。
点击项目属性->C/C++->命令行,在下面的其他选项中添加 /bigobj 即可。
2.5 INSTALL,生成该工程时,将进行安装,若没有修改安装目录(CMAKE_INSTALL_PREFIX变量指定),将默认安装到C盘下,建议cmkae时,修改变量值,若没有修改,将会出现没有权限安装,则需要以管理员的身份运行VS,打开工程,再执行安装操作。
三、运行测试
3.1 图像数据集下载
https://github.com/openMVG/Image_datasets
3.2 运行测试
cmd进入bin目录,输入如下命令执行,各步骤的介绍将在后面的文章中进行分析。
//指定图像路径,相机参数文件,输出路径;
.\openMVG_main_SfMInit_ImageListing.exe -i E:\GIS\ReconstructionDataSet-master\AvignonHotelDesMonnaies -d E:\GIS\openMVG\src\openMVG\exif\sensor_width_database\sensor_width_camera_database.txt -o E:\GIS\OpenMVG_OUT
//指定输入、输出文件;
.\openMVG_main_ComputeFeatures.exe -i E:\GIS\OpenMVG_OUT\sfm_data.json -o E:\GIS\OpenMVG_OUT
.\openMVG_main_ComputeMatches.exe -i E:\GIS\OpenMVG_OUT\sfm_data.json -o E:\GIS\OpenMVG_OUT
.\openMVG_main_IncrementalSfM.exe -i E:\GIS\OpenMVG_OUT\sfm_data.json -m E:\GIS\OpenMVG_OUT -o E:\GIS\OpenMVG_OUT\Recons
.\openMVG_main_ComputeSfM_DataColor.exe -i E:\GIS\OpenMVG_OUT\Recons\sfm_data.bin -o E:\GIS\OpenMVG_OUT\colored.ply
.\openMVG_main_ComputeStructureFromKnownPoses.exe -i E:\GIS\OpenMVG_OUT\Recons\sfm_data.bin -m E:\GIS\OpenMVG_OUT -o E:\GIS\OpenMVG_OUT\Recons\robust.bin -f E:\GIS\OpenMVG_OUT\matches.f.bin
.\openMVG_main_openMVG2openMVS.exe -i E:\GIS\OpenMVG_OUT\Recons\robust.bin -o E:\GIS\OpenMVG_OUT\scene.mvs
四、总结
4.1 在实际的测试中,算法能成功执行,但由于没有启用 OPENMVG_USE_OPENMP,导致运算效率较低,因此,应尽量保证启用OPENMVG_USE_OPENMP以便获得效率提升。各步骤并不一定都需要执行,可根据实际情况调整。
4.2 实验中采用11张不同角度拍摄的如下建筑照片,最终生成模型的点云文件。
最终生成了一个scene.mv的文件,可作为OpenMVS的输入,对点云文件进行重建。