Windows下使用VisualSFM + CMVS/PMVS +MeshLab进行三维重建
参考文档:
VisualSFM和Meshlab实现三维重建过程:http://planckscale.info/tag/visualsfm/(十分感谢)
三维重建数据集:http://vision.ia.ac.cn/zh/data/index.html
一、简介
要想了解从照片如何一步步重建出三维模型,并能操控某些过程,可用的免费开源软件也不少,较常用的是VisualSFM和Meshlab:
第一步:VisualSFM
VisualSFM软件允许我们上传一系列图像,它从这些图像中找到每一个图像的特定特征,利用这些特征信息重建出3D模型的稀疏点云,而后还可进行稠密点云重建。
输入: 围着要重建对象拍摄的一系列照片;
输出: 一个.out文件,存储着每个相机的位置及重建出的稀疏点云;
一个.ply文件,存储着由稀疏点云重建出的稠密点云。
第二步:Meshlab
可用Meshlab对3D网格/点云做各种操作。输入VisualSFM的生成文件,Meshlab通过一系列操作可创建出包含纹理的、干净的、高分辨率的网格,并自动计算UV映射及创建纹理图像。
输入: VisualSFM的生成文件,.out文件和list.txt文件(存储照片序列); 以及.ply文件;
输出: 一个.obj文件,3D模型的网格;
一个.png文件,任意大小的纹理图;
二、源码下载
一共用到三个软件包,我将这三个软件包都放在了一起,可以用这个,就不用每个都单独下了。链接:http://pan.baidu.com/s/1kVDtWhD密码:tngq
配置方法是:将下载好的文件解压,把toolkit\PMVS2\binariesWin-Linux\Win64-VS2010下的所有文件,全部拷贝到与VisualSFM.exe的相同根目录(toolkit\VisualSFM_windows_cuda_64bit)下即可使用,VisualSFM在运算过程中会自动使用PMVS/CMVS。
我这里还有已经配置好的windows 64位的visualSFM文件,如果是64位的win用户可以直接拿来用,不用再配。链接:http://pan.baidu.com/s/1nvsXdEh
密码:zs7w
另外VisualSFM.exe可直接运行,无需安装。
至于每个软件单独下载的网址,我放在最后的补充上了。
三、开始三维重建
第一步:运行VisualSFM
(1)按图中1所示,首先打开使用的图像,输入一系列图片。
(2)按图中2所示,进行SIFT特征点检测和匹配。
(3)按图中3所示,利用SFM进行相机参数的确定以及稀疏点云的重建。
(4)按图中4所示,利用CMVS/PMVS进行稠密点云的生成。
下面是具体流程以及截图:
1、输入一系列图片
按图中1所示,首先打开使用的图像,输入一系列图片。注意要以待重建的对象为中心,围着它每转10-20度拍一张,这样转一圈,有不同高度信息更好。VisualSFM没有照片数量限制,照片越多,重建出的细节越丰富,但重建过程花费时间越长。
2、特征检测及匹配
按图中2所示,进行SIFT特征点检测和匹配。因照片可能存在旋转、缩放或亮度变化,此过程利用SIFT算法提取、描述特征,用 RANSAC算法过滤掉误匹配。此过程亦可利用GPU加速。工作状态实时显示在侧边的log窗口。
3、利用SFM进行稀疏3D重建
利用 SFM 方法,通过迭代求解出相机参数和三维点坐标。即重建出3D模型的稀疏点云。若有“bad”相机(位置错误或朝向错误),结合工具栏上的“3+”按钮和手型按钮即可删除之,使结果更准确。
4、利用CMVS/PMVS进行稠密3D重建
通过 CMVS 对照片进行聚类,以减少稠密重建数据量,而后利用PMVS从3D模型的稀疏点云开始,在局部光度一致性和全局可见性约束下,经过匹配、扩散、过滤生成带真实颜色的稠密点云。(下图为用Meshlab查看效果图)
至此,VisualSFM的工作就完成了,结果都已存盘。若因图片匹配失败或图片较少导致某区域重建失败或重建出的某区域细节不足,可以返回添加一些这个区域的照片,重新来过。但因特征检测和匹配的结果已存盘(每张图像对应的.sift 和 .mat文件都已经生成),所以已经匹配好的图像不必再次匹配,会更快完成。
第二步:运行Meshlab
(1)按钮1,打开VisualSFM的生成文件(.out文件和list.txt文件)。
(2)按钮2,打开显示层目录,检测相机载入是否正确。
(3)按钮3,隐藏可视的稀疏点云。
(4)按钮4,选中杂点区(选中的杂点变为红色)。
(5)按钮5,删除选中的杂点区。
下面是具体流程以及截图:
1. 打开bundle.rd.out 文件
(1)点击按钮1,打开由VisualSFM生成的存储在xx.nvm.cmvs文件夹下的bundle.rd.out 文件。随后会询问是否选择照片列表文件,选择同文件夹下的 “list.txt”即可。这一步会把相机及对应的照片导入进来,对后续的纹理处理至关重要。
(2)点击按钮2,打开显示层目录,检测相机载入是否正确,Render –> Show Camera,因可视化相机的尺寸比网格尺寸大得多,所以需调整相机的缩放因子,scale factor可以从0.0001开始调小,直到相机位置清晰可见。
2. 稠密点云代替稀疏点云
(1)点击按钮3,隐藏可视的稀疏点云;
(2)File –>Import Mesh加载稠密点云(xx/00/models/option-0000.ply);VisualSFM生成多个.ply文件时,需合并成一个mesh。在载入的任何一个.ply上右键选“Flatter Visible Layers”。
3. 清除杂点
点击按钮4选中杂点区,按钮5删除之。大致清了周围的一些杂点后:
4. 网格化
Filter –> Point Set–> Surface Reconstruction: Poisson.
利用Poisson Surface Reconstruction算法由稠密点云生成多边形网格表面。参数可调, Octree Depth:控制着网格的细节,此值越大细节越丰富但占内存越大运行起来慢,一般设10,可慢慢调大。
Poisson表面重建算法会生成一个“不漏水”气泡,把所有场景对象包裹在其中。即模型是封闭的。可以移除多余的面Filters –> Selection –> Select faces with edges longer than,而后利用按钮5删除之。
保存(整个project和mesh)。
5. 修复流形边缘
后续的纹理处理要求网格化的模型必须是流形(MANIFOLD)的,因此需删除非流形边(简单讲就是任何由多面共享的边)。Filters–> Selection –> Select Non-Manifold edges,而后删除之。
6. 参数化(Parameterization)
Filter–> Texture –> Parameterization from registered rasters。
根据相机投影关系创建UV映射。
保存 (整个project和mesh)。
7. 投影纹理
Filter–> Texture –> Project active rasters color to current mesh, filling thetexture。
可设置任意分辨率(512的2的二次方倍:512 /1024 / 2048 / 4096 / 8192…)的纹理图。
**:6和7其实可以合为一步:
Filter –> Texturing –>Parameterization + texturing from registered rasters.
8. 完成、导出
当你调整满意了之后,File –> Export mesh as… a .obj文件。可以生成一个包含你选定分辨率纹理的obj文件。
完成。 笔芯
*补充:
1、下载VisualSFM。网址:http://ccwu.me/vsfm/
下载好的文件名称叫VisualSFM_windows_cuda_64bit.zip,将其解压便可得到exe文件,不需安装。
2、对于要使用密集点云,需下载PMVS/CMVS。网址:http://www.di.ens.fr/cmvs/
3、meshlab生成线框带纹理模型。下载网址:p://www.meshlab.net