重建我周围的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(运动恢复结构),这个名词听上去极具专业性,简单来说,该步骤做两件事情:
- 恢复每张图像在拍摄时相机的位姿(位置和姿态),有两种表达方式,其一是摄影测量领域常用的 X , Y , Z , ϕ , ω , κ X,Y,Z,\\phi,\\omega,\\kappa X,Y,Z,ϕ,ω,κ表达法;其二是计算机视觉领域常用的 R , t R,t R,t表达法。它们是等价的,只是表现形式不同,都是为了描述相机的位置和姿态,通俗的说,就是确定每张图像是相机在哪个地方朝哪个方向拍摄的。
- 恢复相机固有的内部参数,如焦距、主点、畸变参数等,这是可选的,因为有些情形是相机已经提前标定好了这些内部参数。
有很多开源库都能完成这个步骤,比如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世界代码开源连载-3Colmap和OpenMVG对比