1.主要流程
1.1 SIFT:计算图片每个像素点的特征(常见的用SIFT算子)
1.2 SFM:对多张图片像素做匹配对应,通过上步得到的特征,从而估计相机参数,得到稀疏的3D信息
1.3 CMVS/PMVS:根据上步得到的相机参数,做稠密重建,得到点云
1.4 对上步的点云做后处理,得到网格,去除噪声点等。
2.使用源码
完成1.1和1.2流程可以使用Bundler(实现SFM的比较经典的方法)和VisualSFM(好像网页上只放了程序,我没有找到源码),到这一步只是生成了稀疏点云。
CMVS/PMVS可生成稠密点云,完成1.3流程,但一般CMVS/PMVS是加载到Bundler和VisualSFM程序(软件)中的,所以1.1,1.2和1.3是在一个软件中(分步骤)完成的,后面把这三个流程算作一个步骤了。
处理1.4我使用的是MeshLab(开源系统),可以处理点云,生成3D模型。
应该不是很重要的小插曲:其实在前期一开始我还调研了opencv写的一个小程序处理图片,生成效果并不理想,但可能是使用的照片本身效果并不好,因为生成的是** .yml文件(点云文件),我没有查到这个文件格式的处理方法,所以作罢。文档见后面。
3.文件格式问题
第一步:使用Bundler和VisualSFM先生成稀疏点云,再利用集成在程序里的CMVS/PMVS生成稠密点云。
输入:围着要重建对象拍摄的一系列照片;
输出:一个 .out文件,存储着每个相机的位置及重建出的稀疏点云(先输出);
一个.ply文件,存储着由稀疏点云重建出的稠密点云(后输出)。
第二步:使用Meshlab对3D网格/点云做各种操作。输入第一步的生成文件,Meshlab通过一系列操作可创建出包含纹理的、干净的、高分辨率的网格,并自动计算UV映射及创建纹理图像。
输入:VisualSFM的生成文件,.out文件和list.txt文件(存储照片序列);以及.ply文件;
输出:一个.obj文件,3D模型的网格;一个.png文件,任意大小的纹理图;
4.参考文档
4.1 sfm流程概述: http://blog.csdn.net/qingcaichongchong/article/details/62424661
4.2数据集(也就是下载图片和点云的网站)
三维重建数据集:http://vision.ia.ac.cn/zh/data/index.html(国内的我只找到这一个)
这还有一个别人总结的,可以看看,我用的上一个,不知道这个怎么样:
三维点云数据集:https://www.douban.com/note/632704028/
4.3三维重建全过程教程
VisualSFM和Meshlab实现三维重建过程:http://planckscale.info/tag/visualsfm/
这是在Windows下,因为Bundler在Windows下安装的话,还需要安装Linux虚拟环境,我安了一遍没安好(其实是我懒),正好有linux系统,我就直接在那台机器上跑的,虽然,那台机器,配置,相当高,小型服务器的那种,但是!Bundler跑一次就要一夜(可能是我选的照片过大),另外Bundler还有其他的一些问题,我都写在最后总结处了,我这有一篇linux下使用Bundler + CMVS-PMVS进行三维重建的博客:http://blog.csdn.net/u013358387/article/details/71576660 写的很清晰,但有几个小问题,可能博主写错了,我在博客的评论中已经写出来了,另外三篇供大家参考:
(1)Bundler 及 PMVS 常见问题&解决方法http://blog.csdn.net/xdczj/article/details/51301877
(如果你使用的是手机拍摄的照片,你可能找不到CMOS宽度信息,但可以从百度上找找现在手机常用CMOS宽度信息,试一试嘛)
(2)Bundler在Windows下的安装和配置 http://www.cnblogs.com/weizhoupan/archive/2011/03/05/Intro_on_Bundler.html
还是会遇到一些问题,但是可以搜一搜,很好解决。
(3)在CYGWIN下编译和运行软件Bundler ,以及PMVS,CMVS的编译与使用
http://www.cnblogs.com/mothe123/p/3570981.html
4.4 一开始调研的OpenCV实现SfM
OpenCV实现SfM: http://blog.csdn.net/AIchipmunk/article/details/48132109源码和讲解都很清晰,共有四篇,感谢博主http://blog.csdn.net/chuhang_zhqr/article/details/52946689这也是一个关于OpenCV实现SfM的详解,但没有给出源码,好像还没有更完。。
温馨提示:
因为在OpenCV 3.1.x后的版本中把未稳定功能模块(需要用到Surf和Sift算法),都一起独立存放在opencv_contrib目录下面了,,所以如果我们想要使用这个目录的功能,就需要自己重新进行OpenCV的编译,但是过程十分繁琐,配置版本之间的要求十分苛刻,所以很! 难 !安!而且会遇到各式各样的问题。
http://www.cnblogs.com/wjy-lulu/p/6805557.html
(这是一篇关于opencv3.1+contrib的配置大总结,里面有遇到的各式各样的问题,还有安装教程博客的推荐,以及作者自己编译好的半永久配置文件,特别好,我配置了三天,失败无数次,实属无奈,最后用的还是作者的半配置文件,但不知是我前一个配置的成功还是作者的半配置文件,反正吧,最后成功了,笔芯,强推!)
4.5另外的一些
别人对Structure from Motion 资料总结,很全,偏理论的一些资料:http://blog.csdn.net/u014636245/article/details/77527627
这还有个Qt + OpenGL + OpenCV实现SFM算法的,但只生成了稀疏点云,博主没有放出源码,但里面内容能帮助理解sfm原理的一些东西:
http://blog.csdn.net/Mahabharata_/article/details/70799695?locationNum=9&fps=1
5.最后大总结[撒花]
三维重建的方法很多,我隔壁的姐姐正在搞slam,看起来也很高级。SFM的开源库也有很多,我只调研了OpenCV,VisualSFM,Bundler这三个开源库,我的感受,只是我的感受:
OpenCV:要安装3.1.0以上的版本,还要配置opencv_contrib扩展库,安装麻烦,效果还好,生成** .yml文件(点云文件),后续我也不知道咋处理了。。
VisualSFM+ CMVS-PMVS和 Meshlab:成像快,好,安装简单,用在Windows下,使用简单,但生成的点云有超多杂点,不知道为什么,需要你在Meshlab下手动删除处理,好像牵扯到相机系统标定什么的,没查到。。
Bundler+ CMVS-PMVS和 Meshlab:成像最好的,杂点很少,运行最慢的,要求最麻烦的,要求图片长不过2000,还需要知道相机传感器宽度,需在linux环境下使用命令行运行,还有一个问题,他只能建成一面,我把物体四周都拍了,他就拆开,前后建在一面,我也是很惆怅。。
其实文章虽然写了很长,但并不能把我这两个多月所有的全部写进去,由于时间很短,我对三维重建这块的原理也是一知半解,所以,有疏漏有错误以及各种各种不好的地方,希望大家指出多多包涵。先行谢过。然后,因为某些原因,我已经转去AR/VR组了,所以三维重建也就此告一段落,我也是两个月前接到的任务,从对这方面一点不懂到完成这篇总结,感谢各位博主的无私分享,笔芯。我只是一个大千世界中的一只小蚂蚁,对于其中涉及到的算法和需要的优化,我真心无能为力,等我考上研究生,我再来答,加油中~~~
瞎七瞎八写了很多,也不知道有没有价值,抱住胖啊胖的寄几╰( ̄▽ ̄)╯