重建我周围的3D世界代码开源连载-1

Posted Ethan Li 李迎松

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重建我周围的3D世界代码开源连载-1相关的知识,希望对你有一定的参考价值。

最近想做点有趣的东西:重建我周围的3D世界。这听上去像是一个很酷的事情,其实很多人已经做了,且做的很好,我知道有大疆智图、Pix4D、PhotoScan、ContextCapture等早已做的非常完善的商业软件。但是花一点时间做一个不需要商业License随时可用的软件似乎还是有一点意义,反正手痒想写点代码。
在这里插入图片描述
感谢Github开源社区,我计划先用VS2019+QT+开源算法库OpenMVG+OpenMVS来完成这件事情,先简单迈开第一步,后面若有时间,说不定会有更多有趣的事情可做。

作为QT初学者,在界面开发上势必会显得粗糙(也很慢!)。
在这里插入图片描述
还请各位看官见谅。

编译OpenMVG+OpenMVS

首先,我们到Github上Clone OpenMVG以及OpenMVS的源码,然后用cmake-gui进行编译。这是一个较为麻烦的过程,过程不表。

PS. 编译好的OpenMVG(vs2019)工程,我放在百度网盘,链接:https://pan.baidu.com/s/1X9nBeWHXeHR8ETSIqH23XQ 提取码:1i42,感兴趣的同学自行下载。

然后,下载QT,我选择的版本号为5.12.9,很大程度上是因为该版本是免费的。

最后,建立一个QT UI工程,取一个装逼的名字:TellusBuilder
在这里插入图片描述
此外,我还使用了第三方库Eigen用于矩阵运算和OpenCV用于图像IO,版本号分别是3.2.8和3.1.0。

1. 加入图像并显示

在建立好工程后,我们需要实现的第一个功能便是加入图像并显示,添加一个名为"Add Images"的菜单项,并在主框架类中写好槽函数,槽函数要做的事情便是打开对话框导入多张图像。

同时设计并实现一个QTreeView,它依附在一个DockPane之上,导入的图像信息(最直观的就是图像名称)将在Tree控件上逐条显示。
在这里插入图片描述
我还实现了一个简单的交互功能:双击Tree控件上的某一张图像,便在右边的2D视图窗口内显示该张图像。具体的,在双击命令发出后,我会根据图像的绝对路径,导入图像并执行渲染。

嗯,简单而对小白充满诱惑!
在这里插入图片描述
这些操作花费了不长不短的时间,最终得到的效果图下:
在这里插入图片描述
目前只在2K显示器上有这样的界面效果。(咳,自适应窗口调整还没搞定,菜!)

2. 链接OpenMVG,实现SFM

SFM,便是大家熟知的Structure From Motion(运动恢复结构),这个名词听上去极具专业性,简单来说,该步骤做两件事情:

  1. 恢复每张图像在拍摄时相机的位姿(位置和姿态),有两种表达方式,其一是摄影测量领域常用的 X , Y , Z , ϕ , ω , κ X,Y,Z,\\phi,\\omega,\\kappa X,Y,Z,ϕ,ω,κ表达法;其二是计算机视觉领域常用的 R , t R,t R,t表达法。它们是等价的,只是表现形式不同,都是为了描述相机的位置和姿态,通俗的说,就是确定每张图像是相机在哪个地方朝哪个方向拍摄的。
  2. 恢复相机固有的内部参数,如焦距、主点、畸变参数等,这是可选的,因为有些情形是相机已经提前标定好了这些内部参数。

有很多开源库都能完成这个步骤,比如OpenMVG、Colmap、MVE等,这一次我选用的是OpenMVG,它集成了增量式、全局式、混合式SFM,对于无序图像集,我期待它能够有更稳健的表现。

OpenMVG的Github地址:Github : openMVG
OpenMVG的文档地址:OpenMVG : The Open Multiple View Geometry Library

在OpenMVG的介绍中,有这么一张图 ,描述的便是SFM的基本步骤:首先进行特征描述子的提取,再进行影像之间特征点的匹配,然后通过SFM完成整个结构的恢复。 当然实际算法实现会远比描述的复杂,在此不做延伸。
在这里插入图片描述
(图片来自OpenMVF的Github介绍)

好了,今天先到这里,万里长征开始了第一步,我感觉目前更多像是软件开发练习,甚至整个周期我想也可能是这样,但我想这没关系,建好了软件框架,我们可以做更多事情。可视化界面还是比控制台要让人舒心,可不是在排斥控制台啊,可能是算法开发多了想找点新鲜感的缘故,肯定也有人觉得控制台更酷!

下一篇我们来看看怎么用OpenMVG库来完成SFM过程,从而得到每张图的位置和姿态,同时会有一些三维空间的稀疏点和相机渲染工作。

代码我会放在我的Github仓库:TellusBuilder 中,感兴趣的同学,建议先点上star和watch,当然想基于我的工作自己往后做的也欢迎fork啊。
在这里插入图片描述
如果大家觉得此系列不错,请在评论区告诉我吧,说不定我会更新的更勤快一些!
在这里插入图片描述

以上是关于重建我周围的3D世界代码开源连载-1的主要内容,如果未能解决你的问题,请参考以下文章

重建我的3D世界代码开源连载-1

重建我的3D世界代码开源连载-2

重建我的3D世界代码开源连载-2

重建我的3D世界代码开源连载-3Colmap和OpenMVG对比

重建我的3D世界代码开源连载-3Colmap和OpenMVG对比

重建我的3D世界代码开源连载-3Colmap和OpenMVG对比