本项目主要是前段时间因学业及项目需要,去鼓捣了一下多目三维重建这个东西,然后其实发现国外开源的框架和库不少,我索性就照着openMVG和openMVS两个开源库做了一个二次开发,把开源库大体上的功能封装起来,用qt做了一个windows桌面程序,也免得大家去linux下面编译各种库,在脚本里面跑程序了。本来许多人也并不是为了鼓捣这源码的,只是想看看这些开源库的效果而已嘛。
如果有想在windows下配置环境编译的同学可以fork下来研究研究,由于是个人项目,若是有什么bug或者其他问题可以私信联系我。或者不愿意麻烦的,可以直接下载编译后的二进制程序直接Windows下运行就行,希望给同是研究三维重建这一块儿的同学们帮上一些小忙。
由于windows下配置相关三方库的操作步骤较为繁琐,如果同学恰巧和我一样也是用的msvc2017_64的编译器(vs2017或者是带有v141平台工具集的vs2019),那么可以使用我上传的二进制依赖库,来快速进行环境的配置,我也简单做了一个小视频,来帮助大家快速地部署生成项目
视频地址:https://www.bilibili.com/video/BV1p5411g7Ht/
二进制依赖库包地址链接:https://pan.baidu.com/s/1ZEh6Ts7V4JAAb15y5r89RQ 提取码:40zz
若是喜欢的话可以去我的github项目给个star,谢谢啦。
程序为摄影测量影像的三维重建提供解决方案,可将摄影测量的原始影像进行特征匹配重建为三维点云,重建深度图为点云加密,三角网重建,纹理映射,生成纹理模型。
github项目地址:https://github.com/SoulBasic/J3DReconstruction
J3D V2.3 Release 可执行程序包下载地址:https://download.csdn.net/download/qq_26735913/13204748
(附带所有windows下的依赖库,可以在win10下直接运行使用,使用方法请参考本文的示例部分,感谢支持)
(2022.03.24)因msvc2017编译器升级,使隐式转换的条件更苛刻,会导致使用二进制依赖库的小伙伴编译不过,提示无法将参数 1 从“SEACAVE::String”转换为“SEACAVE::String &,解决方案:二进制库中openMVS\src\libs\Common\Util.h的280行改成static String& ensureUnifySlash(String path),参考https://github.com/SoulBasic/J3DReconstruction/issues/2
本应用实现了如下功能:
openMVG库中基于SIFT及其他几种特征子算法的特征提取、特征匹配的封装
openMVG库中提供的全局及增量sfm、sfp、空中三角测量、生成稀疏点云和相机姿态信息的封装
openMVS库中提供的密集点云生成管道封装
openMVS库中提供的三角网模型重建及精炼管道封装
openMVS库中提供的纹理映射管道封装
openMVS库中提供的基于GLFW库的可视化模型预览封装
OSG库中提供的基于openGL库的可视化模型预览及格式转换封装(转换到osgb格式可以在smart3D打开、若本机安装obj2gltf插件可转换到gltf供Cesium加载)
基于空间前方交会的图像像点坐标到实景三维坐标的映射可视化组件
本项目在开发时的环境如下:
Windows 10 + VisualStudio 2017
openMVG
openMVS
(本项目所用的openMVG、openMVS在原项目的基础上有做细微更改,实际构建使用的代码也在我的仓库中,有需要的同学可以一起使用,若使用原版库,则J3DGUI中预览模型只能使用兼容模式)
openCV(openCV 3.4.1 & openCV 3.4.1_contrib)
VCG:(VCG 1.0.0)
CGAL(CGAL 5.0.2 x64)
Boost(boost_1_67_0-msvc-14.1-64 )
QT (qt-opensource-windows-x86-5.14.2)
LibQGLViewer(libQGLViewer-2.6.4)
Ceres(ceres-solver-1.14.0)
Eigen (eigen-3.3.7)
GoogleFlags (gflags 2.2.2)
GoogleLog (glog 0.3.3)
CXSParse(CXSParse 3.1.1)
LIBJPEG(jpeg-9d)
GLFW(glfw-3.3.2)
以下的三方库在项目3rd_party或项目目录中附带,无需自行编译安装
OpenSceneGragh(osg 3.4.1)
LIBPNG(libpng 1.6.37)
GLEW(glew-2.1.0)
GDAL(gdal-2.0.3)
1.请将上述库和环境一一构建(该项目基于x64,建议构建x64的库),其中三方库需要在每个vs工程中INSTALL二进制库(INSTALL后库目录会在C盘的Program Files中,不INSTALL也可以,只要能找到具体include目录和lib目录及文件即可)
2.fork并pull本项目到本地,然后在vs中打开本项目代码,(由于需要用到qt,请在vs中下载qt拓展,并配置好相关编译器(我用的是msvc2017_64))
3.检查所有项目(J3DMVSEngine、J3DViewRender、J3DEngine、J3DGUI、J3DViewer)的项目属性,并检查各个三方库的include目录(C+±常规-附加包含目录)、lib目录(链接器-常规-附加库目录)(链接器-输入-附加依赖项)是否正确(我的三方库统一安装在C:\openMVS下,如果不是安装于此,需要进行相关的修改)
构建并编译J3DReconstruction,执行J3DEngine以及J3DGUI应用程序,可实现在J3DGUI程序中可视化调用openMVG及openMVS的构建管道
管道中算法实现及介绍可参考openMVG及openMVS的Wiki页面:
https://github.com/cdcseacave/openMVS/wiki
https://github.com/openMVG/openMVG/wiki
这里使用一组照片作为例子
(照片来源:https://www1.maths.lth.se/matematiklth/personal/calle/dataset/dataset.html)
将源图片放在一个文件夹里
若是相机型号比较冷门,需要在文件-添加相机参数中添加相机的几项参数(这个参数可以参考下图去图片元数据中获取,若没有元数据或不齐全,可以去google一下对应相机的具体参数,程序是通过以下公式进行粗略计算的)
s e n s o r W i d t h = 2 ∗ ( f o c a l ∗ s t d : : t a n ( ( 0.5 ∗ F O V ) / 57.296 ) ) ; sensorWidth = 2 * ( focal * std::tan( (0.5 * FOV)/57.296) ); sensorWidth=2∗(focal∗std::tan((0.5∗FOV)/57.296));
若是利用焦距/FOV等参数计算不够精确,也可自行获取相机型号及传感器宽度值手动导入SenWidDB.txt
(※※※注:若SFM步骤时提示There is no defined intrinsic data in order to compute an essential matrix for the initial pair,则说明缺失源图片的相机传感器参数,需要根据以下图片中的情况进行手动添加,否则会SFM重建失败※※※)
添加之后在SenWidDB.txt中理应也会出现对应的 相机型号;传感器宽度值
若SenWidDB.txt中无源图片对应的相机型号,会出现SFM重建失败等错误。
当然其实大多数的相机都有预设值,源于官方数据,不需要手动添加的的,具体可以在程序路径中的SenWidDB.txt查询。
我也提供了一组测试图片,在项目的test文件夹中,可自行下载并添加NIKON D60的传感器参数(23.6mm)
然后在程序中中选择全自动三维重建选项,(若提示无缓存访问权限,请用管理员身份运行)填写源图片路径以及其他参数,确认后即可跟随管道完成重建任务,最终可在J3DGUI程序中可视化查看结果
(若是全自动出现程序未响应或者其他错误,可以尝试分步进行,目前发现偶尔在win7遇到这样的问题)
程序运行结束后,在输出路径中会有对应的重建文件,用J3DGUI或用其他第三方模型预览器打开都可。
可视化预览也支持以下键盘操作
调整视角:鼠标左键按住拖动
调整大小:鼠标滚轮调整
调整视点:鼠标双击模型某 点/面 将其居中
显示相机位置:C键
渲染点云:P键
调整点云中的点大小:A/S键 A键放大 S键缩小
渲染网格:M键
渲染纹理:T键
如果需要预览或查看osg或osgb格式模型,则需要在软件路径下含有OSG库中的osgviewer.exe和osgconv.exe
从J3DGUI的文件-坐标映射打开,选择完整运行SFM引擎中的步骤后的目录(即含有SparseCloud.J3D文件的重建结果目录),以及目标地形DSM数据(需使用三方软件生成,如CC或photoscan等)。
注意:需要SFM重建数据和DSM数据的地理参考相同(J3D的SFM引擎默认使用ECEF坐标系),如果无法获取ECEF坐标系下的DSM数据,则可以使用J3DGUI中 分步三维重建-导入其他SFM数据中的功能,导入其他软件生成的Blocks Exchange XML格式的SFM数据,只需保证生成XML数据时使用的地理参考和DSM数据相同即可。
导入后可以选择可用的影像,在影像上右键选择像点,即可映射对应点的地理坐标,并保存到点集,可将点集输出为dxf格式在Auto CAD等软件中预览。