序列图像三维重建 学习过程流水账
2016/01/13
想找个计算机视觉或者图像处理的工作,遂开始收集各种信息,搜了下找工作的网站,下了几篇三维重建的硕士和博士论文,上了下知乎。
前两年就知道了有123Dcatch这么个玩意,当时搜到了这么个东西
http://www.didayin.com/archives/632
还一直留着这个书签,昨天照着下了visualSFM,CMVS,MeshLab做了一下,效果如下
拿手机拍的一个欧莱雅洁面膏,放在一张有字的纸上拍的,光线不好。在MeshLab里头看有24万个Vertices,想要删除不要的点结果一操作就卡死,遂放弃。
知乎上搜到这个 https://www.zhihu.com/question/29885222/answer/48940748
第一个链接里头的内容这么说:
照片重建的主要步骤
整个重建过程大致有以下几步,
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 进行网格处理。
一堆关键词SIFT,SFM,Levenberg-Marquardt 算法,Bundler。。。SIFT还好,以前玩过,剩下的一个个弄懂
2016/01/15
搜了一堆东西,搜到了几本书
《Multiple View Geometry in Computer Vision》百度网盘上找到的,这本书有中文版本,叫《计算机视觉中的多视图几何》(新浪微盘上找到的)。另外还有本
《计算机视觉中的数学方法》。现在了解到原来 三维重建 的数学基础是 ‘射影几何’。
搜了一下知网,发现上面一堆三维重建的硕博论文,都做滥了,找了几篇好懂的,比看上面说的几本书速度快多了。。。
2016/01/21
在看一篇硕士论文《基于多幅图像序列的三维重建》,作者:佘彦杰
结合上面说的几本书一起看,知道了F矩阵
m'Fm = 0; % 至少要7对特征点才可以确定F矩阵,m,m'为3 x 1的二维齐次坐标
要开始看代码写代码了
Bundle: http://www.cs.cornell.edu/~snavely/bundler/
上面这个网页里有个相关的项目BigSFM,与其相关的是一个低维的例子1DSfM: http://www.cs.cornell.edu/projects/1dsfm/
SFM维基百科: https://en.wikipedia.org/wiki/Structure_from_motion
下了Bundle在github上的源码包,呵呵,光Bundle.cpp就4000多行!玩毛啊!怎么下手啊!怎么又是这样啊!
幸好维基百科下有其他版本的软件包,本人MATLAB玩的熟,拿那里头的下手吧,列了个计划
===================================
1,先上低维的,简单的版本,进行原理性验证
2,先上matlab版本的
配套工作:
1,vim
2,git
3, make,cmake
4,熟悉看大型软件源码的工具
5,常用的C语言数学包的运用
6,C++
===================================
2016/01/22
哎,MATLAB版本的也太复杂了,说明写的也不够详细,看不懂。秉着代码看不懂就看一看理论,理论看不懂就看一下代码的原则,回过头来
看《计算机视觉中的数学方法》(作者:吴福朝) 这本书倒是发现写的挺简洁,配图也比硕士论文里的漂亮的多。前两天去图书馆想借这本书来着,
一看,硬壳的封面和底面,还这么大,就不想借了,背来背去多麻烦,现在想想可能过两天还得去借一下,寒假在家不用看pdf,对着纸质的就
能撸了,另外循着上面的matlab版本软件找到一个链接: http://www.peterkovesi.com/matlabfns/index.html 。 在这个链接靠近下面的
部分有个 Functions Supporting Projective Geometry 的一堆函数挺不错。
想起来一个原则:假如你看不懂一个东西,只有两个原因,一,这本书非常垃圾,作者抄别人写的书,逻辑不清晰,不符合初学者的逻辑。这样的话
应该再接着花时间去搜集信息,直到找到一本你咽的下去的书,博客,视频教程等等。二,你的知识结构的确没达到看懂这些东西的地步。你应该接着
去做好知识上的铺垫工作,了解看懂这些东西需要在之前再学些什么东西进行铺垫,然后按照第一点里的步骤来,搜集信息。
matlab的软件包的都是从多视图几何部分开始写的,sift,ANNS等算法都没怎么突出,我得撸一遍了。
2016/01/24
这两天晚上抽时间找了下sift的资料细细看了下,在博客里另起一篇专门写sift
2016/02/05
Bundler作者Noah Snavely主页:http://www.cs.cornell.edu/~snavely/
他的博士论文:http://www.cs.cornell.edu/~snavely/publications.html
2016/02/18
最近在摆弄sublime和VS2012以及opencv,想用sublime Text3搭个opencv的开发环境,貌似找不到什么资料,以后再尝试。
只好参照浅墨关于opencv的入门博客装了VS2012,还好,opencv(2.4.11版本)的示例程序跑起来了。
2016/03/09
先不打算找图像处理的工作了,但是作为爱好还是会继续学习计算机视觉方面的东西,节奏会很慢,搜了些关于dll和lib的知识,另起一篇博客
保存搜集到的资料。opencv里头尽是一堆dll和lib~~~要得心应手必须了解它们的性质。
2016/04/24
论文今天交了,坐等答辩,要一条路走到黑了,反正我以后不搞机械,《visual c++ 2005 入门经典》是本好书,求图像处理的工作啊!!!
2016/04/30
前几天撸了一天C,对着《C++ primer 第四版》中文版pdf 撸了两天C++,我还是习惯快速浏览后简要的写一些代码,然后在代码里头详细的注释
这种方式来学习C++,写的代码都传到网盘里了。
在自己笔记本上装了 Win7 + opencv2.4.11 + VS2012,按照浅墨关于opencv的入门博客装的
链接:http://blog.csdn.net/poem_qianmo/article/details/19809337
又在办公室台电脑上装了 Win xp + opencv2.3.1 + VS2008,
链接: http://www.cnblogs.com/magic-cube/archive/2012/03/03/2378546.html
办公室电脑装的时候出了 测试图像不是灰度图,测试图像没和cpp文件放在一起 的错误,记录留存。
《深入理解OpenCV 实用计算机视觉项目解析》这本书有些项目不错,大致扫了下,以后慢慢看。
想用cmake + codeblocks 编译opencv源码,没成功,以后再搞。
可以开始学opencv了!
2016/05/17
研究生的毕业答辩昨天搞完了,之后有大把的时间搞SLAM了。
2016/05/24
matlab R2016a的计算机视觉工具箱非常给力,要的东西都在里头,这两天要细看一下
2016/05/29
急于用matlab完成一个SFM的原型,可是卡在摄像机自标定了,还是要看吴福朝的那本书,数学部分跳过去
就看不懂后面的东西了,慢慢来比较快。发现了一个不错的网址,新开一篇博客保存SFM的matlab版本最新代码
http://www.cs.unc.edu/~marc/tutorial/node3.html
2016/06/06
看了一个礼拜吴福朝的《计算机视觉中的数学方法》和一堆知网上摄像机自标定的论文,《基于序列图像的摄像机自标定方法》吴庆双
比较不错,找到一个不错的示例程序https://github.com/yihui-he/3D-reconstruction,然而其中还是没有摄像机自标定部分,摄
像机自标定部分可能还得自己写。以后另起一篇细述。github上没找到简洁易懂的self calibration的matlab版本代码,可能是我功力不够。
2016/06/19
卡在相机自标定上了,简直要哭了。哪位大神救救我~~~自标定以后的步骤倒搞得蛮透彻了。再添几个链接:
http://blog.csdn.net/xjbzju/article/details/6538289
http://blog.csdn.net/aichipmunk/article/details/48132109
求出内参K就能求出本质矩阵E,就可以分解出R2,T2
2016/07/11
毕业的一堆破事搞了这么久,中间断断续续的做了一些工作,但是还是没有搞定相机自标定的问题。在mathworks有个
很简单的SFM工具箱下载了研究下,虽然包含自标定部分,但是需要提供相机内参数矩阵的一个初始值,意义不大。
所以决定索性绕开自标定问题,假设相机内参数已知,先研究3D重建。上面那个
https://github.com/yihui-he/3D-reconstruction
是一个非常好的上手项目。大家运行一下就知道效果怎么样了。配的pdf资料也很不错。
内参数直接读取相片的EXIF信息得到。
2016/10/23
三维重建做的更精致点变成SLAM,我八、九、十月份都在搞bundle和学SLAM,也写了其他几篇博客。
工作的话广州的做直播的YY要我,然而最后我还是决定不去了,按家人意思回家考银行。
2016/11/29
银行没考上,shit!
2017/07/29
slam做的好也就得到一堆点云,不加上语义分割之类的东西没什么作用。而且未来五到十年,硬件变
厉害了,迟早大部分要被集成进硬件。slam本身是比较机械的技术,没什么发挥空间。最近看到一个
CNN-SLAM倒是做的比较漂亮。
机器视觉做到极致,最好是让机器知道什么东西在自己的什么方向,会不会动,能不能接近,会不会碰上,能不能
压过去之类的。得到点云只是第一步。