【原文:http://www.didayin.com/archives/632】
(如果您在使用 123D Catch 的过程中遇到任何问题,欢迎加入 Autodesk 的官方 QQ 群:232449110,有专人为您解答问题哦)
Autodesk 的 123D Catch 让我们能够很简单的根据一组照片构建3D物体,你只需要从各个角度拍摄希望建模的物体,然后通过 123D Catch 将照片上传到 Autodesk 的云端服务器,等待几分钟之后,就能下载到完成的模型,是不是像变魔术一样?
但是在上传照片和下载模型之间到底发生了什么,由照片重建三维模型是个怎样的过程,123D Catch 却没有告诉好奇的我们。而且总是要把图片上传到云端总感觉不太方便,说不定我们偶尔想要重建个私密的模型呢?今天就让我们尝试用开源软件来替代 123D Catch,完成照片重建的任务!
我们将要建模的对象是 123D Catch Windows 版提供的示例照片,你可以在 123D Catch 的 sample_project 目录中找到他们。
123D Catch 和开源软件方案的建模效果如下。左边是 123D Catch 的局部,右边则是我们自己动手建模的结果,觉得哪个效果好些呢?
需要事先说明的是,本文的目的在于展示一种技术上的可能性,并非主张人们自己动手来尝试照片重建。对于绝大多数用户来说,123D Catch 仍然是照片重建的首选。其次,笔者只是在业余时间进行了一些调查,并非计算机视觉科班出身,行文中如果有错误敬请指正。
那么,让我们先了解下照片重建的主要步骤吧。
照片重建的主要步骤
整个重建过程大致有以下几步,
1、找出各张照片中的特征点,进行两两匹配
这一步讲究的是能够精确识别物体的局部特征,并且进行快速准确的匹配,由于在实际拍摄中,可能存在物体的旋转、缩放、或者亮度变化,所以难度不小。现在常用的算法是由 David Lowe 提出的SIFT 方法。
2、根据匹配的结果,利用射影定理计算得到相机位置等场景信息
这步又称运动恢复结构(Structure from Motion)。对于结果的衡量标准主要是准确性,流行使用的是基于 Levenberg-Marquardt 算法的 Bundler。我们也可把这一步称为稀疏重建(Sparse Reconstruction)。
3、将场景信息与原始照片结合在一起,得到照片中物体的三维点云
有了场景信息,我们就能进行多视立体重建(Multi-view Stereo Reconstruction)了。由于处理的图像精度通常都比较高,所以这一步的计算量很大,执行效率也因此成为判断算法优劣的标准之一。除了效率之外,还需要考量重建的精度以及完整性,因为这些因素决定了点云的质量。PMVS 算法是目前表现最好的多视立体重建算法。另外,为了表示和稀疏重建的区别,这一步也成为密集重建(Dense Reconstruction)。
4、根据三维点云构建三维模型
我们已经得到了物体表面的一系列三维点云,但是还需要把这些点连成面,才能在一般的三维建模软件中使用。现在比较常用的是泊松表面重建算法(Poisson Surface Reconstruction)。是的,就是发明了能够用来预测火车是否晚点的泊松分布的那个人。
怎么样,是不是够复杂的。了解了这些主要步骤之后,让我们来实际操作吧。
使用开源软件完成重建
我们将使用 VisualSFM 来完成其中的前三步,VisualSFM 中已经包含了 SIFT 和 Bundler 的算法,不过为了完成第三步,你还需要下载 PMVS 的升级版 CMVS,VisualSFM 会自动调用。而对于第四步,我们需要使用 Meshlab 进行网格处理。
让我们开始吧。
1、识别特征点
打开 VisualSFM 后,我们点击批量添加照片的按钮
在弹出的对话框中选取 sample_project 中所有佛陀的照片
如果你在菜单中点选了 Tools > Show TaskViewer,将会在其中看到图片已经全部载入了。
图片载入之后,我们可以点击工具栏中四个箭头的按钮,开始查找特征值与匹配。
在 TaskViewer 中你能够看到每张照片中的 SIFT 特征值的数量,以及花费的时间。SIFT 计算结束后,VisualSFM 将会对这些特征逐一比对。
特征值的查找与匹配完成后,你会看到对于每张照片,VisualSFM 都为我们生成了一个 .sift 文件以及一个 .mat 文件,其中记录了特征点和匹配信息。
2、稀疏重建
完成了特征点的识别与匹配后,让我们点击类似于“快进”的按钮开始稀疏重建。
稍等片刻后,你就会看到 VisualSFM 为你重建的拍摄场景。
留意到佛陀周围的那些小点吗?那是 VisualSFM 计算得到的拍照时,照相机的各个位置。
3、密集重建
完成稀疏重建后,你会发现工具栏中多出了几个按钮,让我们点击其中的 “CMVS”,进行运算量最大的密集重建。
在弹出的对话框中填写希望保存的目录。
点击保存后,VisualSFM 就为我们开始进行漫长的密集重建了。重建完成后,在之前指定的目录中将会产生一系列的文件。
其中最关键的,是 models 目录中的 .ply 文件。
当我们在 MeshLab 中打开这个 .ply 文件后,就能看到重建结果了。
有没有看到右侧的佛陀,是不是像块埋在怪石中的玉?
4、构建三维模型
在进行泊松重建前,我们需要去除周围不需要的点云。Meshlab 工具栏中的下面两个按钮可以帮助我们选中以及删除。如果你觉得默认大小的点很难选取,还可以在选项中修改点的显示尺寸。
这是整个重建过程中最需要人工参与的部分。有否彻底清除不需要的部分将直接影响之后的重建效果。我们的佛陀清理的结果如下。
你可能会问这不是已经是个3D模型了吗?但是让我们放大了看下,我们会看到整个模型仍然是由点云构成的。
让我们开始泊松重建吧。
我们首先在菜单中选择 Filters > Point Set > Compute normals for point sets,计算点云的法线。
之后,仍然是 Point Set 菜单,选择其中的 Surface Reconstruction: Poisson,在弹出的对话框中我们需要输入几个参数。
让我们改动上部的两个参数。你也可以自己调整,看看什么样的参数组合对于你的模型结果最佳。点击 Apply 后,可以看到 MeshLab 为我们生成了模型的表面。
但是此时,这些新建的面并不包含颜色信息。我们需要 MeshLab 根据已有的点云,为我们计算新增的面的颜色。 可以在菜单中选择 Filters > Sampling > Vertex Attribute Transfer,
在弹出的对话框中,注意调整颜色的源和目标。
涂色过程应该不费时,稍等之后我们就能看到重建结果了!
至此整个重建过程结束。你可以将这个模型输出成你希望的格式,进行下一步的编辑或者打印。另外,在佛陀左手下方有块白斑,这是因为那里是我们的拍摄死角。你可以补拍一些照片。值得庆幸的是,当你补拍了照片并且添加到 VisualSFM 中时,其他照片的特征值以及匹配结果不需要重新计算。
对比 123D Catch,离线的开源方案让我们可以了解整个重建过程,也提供了更高的自由度,但是尝试之后它的缺点也是显而易见的。首先,离线开源方案需要更多的照片。123D Catch 可以在不满十张照片的情况下重建出不错的效果,但是开源方案则至少需要几十张,Autodesk 从 Acute3D 处购得的技术之强大可见一斑。其次,由于整个重建过程的计算量很大,在桌面系统上开源方案会跑的很吃力。重建佛陀,123D Catch 的云端服务器在几分钟内就能完成,但是跑在 4 核的 64 位 Windows 环境上的开源软件,光密集重建一步就花了半个多小时。
另外,除了本文中提到的 VisualSFM 之外,还有一些可以进行照片重建的免费方案,以后有机会让我们再看吧。
(感谢您读到这里,希望我们的文章对您有用。我们也希望您帮我们个小忙,我们有一份包含五个问题的用户调查,有时间的话请点击填写吧。)