Windows下基于openMVG及openMVS的三维重建Qt应用程序

J3D模型重建系统

J3DReconstruction

简介

本项目主要是前段时间因学业及项目需要,去鼓捣了一下多目三维重建这个东西,然后其实发现国外开源的框架和库不少,我索性就照着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,谢谢啦。

本应用是Windows下基于openMVG+openMVS的三维重建解决方案以及基于Qt的可视化桌面平台

程序为摄影测量影像的三维重建提供解决方案,可将摄影测量的原始影像进行特征匹配重建为三维点云,重建深度图为点云加密,三角网重建,纹理映射,生成纹理模型。

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)

Windows下构建过程:

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

SFM及MVS重建模块:

这里使用一组照片作为例子
(照片来源: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(focalstd::tan((0.5FOV)/57.296));
若是利用焦距/FOV等参数计算不够精确,也可自行获取相机型号及传感器宽度值手动导入SenWidDB.txt
(※※※注:若SFM步骤时提示There is no defined intrinsic data in order to compute an essential matrix for the initial pair,则说明缺失源图片的相机传感器参数,需要根据以下图片中的情况进行手动添加,否则会SFM重建失败※※※)
senwidinfo
添加之后在SenWidDB.txt中理应也会出现对应的 相机型号;传感器宽度值

若SenWidDB.txt中无源图片对应的相机型号,会出现SFM重建失败等错误。

当然其实大多数的相机都有预设值,源于官方数据,不需要手动添加的的,具体可以在程序路径中的SenWidDB.txt查询。

我也提供了一组测试图片,在项目的test文件夹中,可自行下载并添加NIKON D60的传感器参数(23.6mm)

然后在程序中中选择全自动三维重建选项,(若提示无缓存访问权限,请用管理员身份运行)填写源图片路径以及其他参数,确认后即可跟随管道完成重建任务,最终可在J3DGUI程序中可视化查看结果
(若是全自动出现程序未响应或者其他错误,可以尝试分步进行,目前发现偶尔在win7遇到这样的问题)
engine
paras
程序运行结束后,在输出路径中会有对应的重建文件,用J3DGUI或用其他第三方模型预览器打开都可。

gui
可视化预览也支持以下键盘操作
调整视角:鼠标左键按住拖动
调整大小:鼠标滚轮调整
调整视点:鼠标双击模型某 点/面 将其居中
显示相机位置: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等软件中预览。

坐标映射

OpenMVG(多视图几何库)和OpenMVS(多视图表面重建库)是一对用于三维重建的开源工具库。 OpenMVG的三维重建原理是基于多视图几何的算法。它首先通过结构从运动(SfM)算法计算相机的位姿和三维特征点在多个图像的位置。这个过程可以通过解决一系列视觉几何方程来实现,例如基础矩阵估计和光束法平差。然后,OpenMVG使用三角化算法将这些特征点转换成三维点云。最后,通过利用全局最优化技术,OpenMVG进行了相机内外参数的联合优化,从而进一步提高了三维重建的质量。 而OpenMVS的三维重建原理则是基于稠密点云的重建。它接受OpenMVG的输出结果,即相机的位姿和三维点云,然后使用逐像素的基于多视图的三角化算法,将这些稀疏点云转换为稠密点云。在这个过程OpenMVS还利用了光度一致性和相机位姿约束来提高点云的重建质量。接下来,OpenMVS使用基于代价体积的方法对稠密点云进行三角网格化,以生成具有几何形状的三维模型。最后,OpenMVS通过进行网格细化和纹理映射,进一步优化和完善三维模型的外观和细节。 总的来说,OpenMVG和OpenMVS组合使用,可以实现从多张图像到稠密三维模型的完整三维重建流程。OpenMVG通过基于多视图几何的算法,实现从图像到稀疏点云的转换;而OpenMVS则通过逐像素的三角化和基于代价体积的方法,将稀疏点云转换为稠密点云,并最终生成具有几何形状和纹理的三维模型
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值