[CV] Structure from motion(SFM)- 附我的实现结果

[CV] Structure from motion(SFM)- 附我的实现结果【更新】我的新博客:www.ryuzhihao.cc,当然这个csdn博客也会更新本文在新博客中的链接:点击打开链接完成时间:2017年2月27日博客时间:2017年4月26日去年,我有幸了解到image-basedmodeling的相关知识。作为一个大三本科生,虽说自己此前也做过一些相关工作,但是要自己实现Structuref…

大家好,又见面了,我是你们的朋友全栈君。

【更新】我的新博客:www.ryuzhihao.cc,当然这个csdn博客也会更新
              本文在新博客中的链接:点击打开链接

完成时间:2017年2月27日

博客时间:2017年4月26日

 

        去年,我有幸了解到image-based modeling的相关知识。作为一个大三本科生,虽说自己此前也做过一些相关工作,但是要自己实现Structure from motion,确实是费尽了我的脑袋壳儿(3个月)。

       哦对,顺带宣传一下此前自己尝试过的一个相关的内容:Shape from shading(点击打开我的另一篇博客)。

 

首先贴下我的程序的实现结果:

       平台:Qt + OpenGL + OpenCV

       功能:(我实现的SFM算法——稀疏点云的获取)

       程序截图:

1. 雕像

输入数据:

[CV] Structure from motion(SFM)- 附我的实现结果

输出结果:

[CV] Structure from motion(SFM)- 附我的实现结果

 

2. 紫薇树:

输入数据:

[CV] Structure from motion(SFM)- 附我的实现结果

输出结果:

[CV] Structure from motion(SFM)- 附我的实现结果

 

3. 矮灌木

输入数据:

[CV] Structure from motion(SFM)- 附我的实现结果

输出结果:

[CV] Structure from motion(SFM)- 附我的实现结果

写在前面:

 

       前面给出了三组测试用例的执行结果: 我的SFM算法实现。整体看来还是不错的,程序是其实有些不足,比如:对图像的分辨率要求比较高、若图像抖动会影响重建效果、恢复速度慢等等缺点。相比起VisualSFM及CMVS还是缺少了不少东西的。

       关于SFM和CMVS的关系:SFM是得到稀疏点云的方法,CMVS是日本Yasutaka Furukawa(Washington University的assitance professor)基于SFM提出的多幅图像密集点云的提取方法。当然了,如果想要自己实现密集点云的CMVS,首先要实现稀疏点云的SFM。

       我实现的程序也算是能得到相对密集的三维信息,也有比较快的执行速度。限于自己的知识水平有限,暂时无法做到CMVS那样的密集点云的效果。

       顺带说明一下:我采用的方法大抵是知网IEEESIGGRAPH上能够找到的关于SFM的Papers。说实话,虽说实现了出来,也是博主照葫芦画瓢,对原理的认识还是挺模糊的。不过还是希望接下来的介绍能够对看到这篇文章的人有所帮助。欢迎讨论~~~

 

Structure from motion简介:

     Structure from motion (SfM) is a photogrammetric range imaging technique for estimating three-dimensional structures from two-dimensional image sequences that may be coupled with local motion signals. It is studied in the fields of computer vision and visual perception

    Structure from motion(SFM)是由一系列包含着视觉运动信息(motion signals)的多幅二维图像序列(2D image sequences)估计三维结构(3D model)的技术。它属于计算机视觉及可视化的研究范围。

 

Structure from motion 的简单原理:

     说明:paper里面的太多数学原理、公式啥了,看的心累。这里整理出来的是简单的步骤,数学部分几乎没有。当然能理解最好,不要像我这样子半吊子…… 其实很多东西opencv已经帮我们做好了,我们只需要通过其中的函数就能实现下面的几个关键步骤。

1. 相机坐标系

为了更好的表示相机的旋转、平移,需要先引入相机的参考系。Z轴沿镜头方向,如下图(几乎每篇关于SFM的paper必有的图片……)

[CV] Structure from motion(SFM)- 附我的实现结果

2. 相机的内参矩阵和外参矩阵

    熟悉OpenCV的同学应该知道这一点。在市面上大多数计算机视觉方面的教材对这个都有很详细的讲述。这里不详细说了,不清楚的娃儿可以翻翻教材或者看看下面的博客:

     http://blog.csdn.net/liyuan123zhouhui/article/details/52043683(摄像机内参、外参矩阵)

这里需要提一下:

     一般来讲,内参矩阵需要通过标定求出来,但是其实部分参数我们可以从图片的信息中获取,在图片上右键“属性”,可以找到部分需要的信息:

[CV] Structure from motion(SFM)- 附我的实现结果

     外参矩阵的话:[R T] 包含从世界坐标系到相机坐标系的旋转、平移关系。

三、特征点提取和特征点匹配

     这里可以不用我们去实现,使用OpenCV中的SIFT或SURF都可以做到。不过需要OpenCV3.0,之前版本的OpenCV可以直接使用SIFT和SURF,但是3之后的版本有我们需要的功能,只是它的SIFT等等被移动到nonfree.hpp里去了。具体的配置可以参考下面的链接(亲测可行,Qt下配到吐血!!!!):

     (OpenCV3.1.0+Contrib配置)http://blog.csdn.net/qq_25517467/article/details/52189057

 

四、计算本征矩阵,进一步求出R、T矩阵

       在得到匹配筛选过的特征点后,就能够计算出图像间的本征矩阵了。使用OpenCV中的findEssentialMat()方法可以直接实现。之后对求得本征矩阵essentialMat进行分析,得出图像间的相对变换矩阵R和T(两幅图像间的变换关系)

 

五、利用已知的R、T和匹配的特征点还原三维坐标。

      这一步,需要我们自己去实现了。但是建议先去了解一下“三角测距”。因为到现在,我们已经知道图像两两之间的旋转平移的变换矩阵R、T,以及图像两两间的特征点匹配信息。这个就和“三角测距”非常类似。

     关于这一步的实现可以参考各个论文或者下面的链接:

     http://blog.sina.com.cn/s/blog_662c78590100zqwd.html

 

六、补充:

1. 关于SIFT、SURF的选择:SIFT得到的结果相对比较稀疏且特征点的价值较高,但是OpenCV里的SIFT不太稳定,很多图片在提取过程中会出现莫名其妙的错误。SURT的话特征点会比较多但是质量不怎么好,但是OpenCV的SURF非常稳定。

2. 关于稀疏点云SFM得到密集点云CMVS。

     可以查阅相关论文,关于“面片”的部分。(我没有往下接着琢磨……)

3. 使用我的方法实现的SFM,如果想要有较快的速度,建议使用OpenCV的GPU模块。

4. 大致的实现流程如下:

[CV] Structure from motion(SFM)- 附我的实现结果

祝大家好运。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/151303.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • rootfs.bin_libhdfs

    rootfs.bin_libhdfs忘了到底前几年看的一篇什么busybox的教程,写的及其复杂,以至于让我这么久以来一直不敢再去碰这个东西,直到今天又再次有了这个需求,特来再搞一次,没想到不到俩小时,一次搞定,特将这过程记录下来,以后也好有个参考。1环境宿主机:Ubuntu18.04交叉编译工具链:aarch64-linux-gnu-gcc7.4.0目标机:Armv8i.MX8EVKboard2下载…

    2022年10月7日
    2
  • 电阻参数_关于电阻的相关参数

    实际应用时,通常采用平均电阻温度系数,定义式:TCR(平均)=(R2-R1)/R1(T2-T1)有负温度系数、正温度系数及在某一特定温度下电阻只会发生突变的临界温度系数。紫铜的电阻温度系数为1/234.5℃。不同类型电阻温度稳定性从优到次,依次为:金属箔、线绕、金属膜、金属氧化膜、碳膜、有机实芯。1。镀金并不是为了减小电阻,而是因为金的化学性质非常稳定,不容易氧化,接头上镀金是为了防止接触不良(不…

    2022年4月8日
    50
  • 怎样更改pycharm的项目默认保存路径_vscode怎么给python导入包

    怎样更改pycharm的项目默认保存路径_vscode怎么给python导入包 参考原文:https://blog.csdn.net/yggaoeecs/article/details/78378938  还有这篇,同时讲了anaconda的安装:https://blog.csdn.net/qq_29883591/article/details/78077244https://blog.csdn.net/qq_29883591/article/details/78…

    2022年8月27日
    5
  • 一个前端开发关于运维工具的思考:运维工具一定是难用的吗?「建议收藏」

    “在2019年的今天,我们想要一个易用的运维工具!”开源代码地址:https://github.com/WeBankPartners/we-cmdb一、背景WeCMDB作为WeCube开源计划的一部分,已经开源了一段时间。开源之后,有许多用户给了我们很多有用的意见及建议,帮助我们从不同的视角审视WeCMDB。这也是我们需要开源的原因之一,听取各方的意见相比于闭门造车可以少走更多的弯路…

    2022年4月11日
    35
  • C++学习——继承与派生「建议收藏」

    C++学习——继承与派生「建议收藏」普通继承例题:定义一个名为Phone的手机类,有如下私有成员变量:品牌、型号、CPU、电池容量,如下成员函数:构造函数初始化手机的信息。在此基础上派生出NewPhone类,派生类增加了两个新的私有数据成员,分别用于表示颜色和价格,增加了一个成员函数用来输出手机信息。代码如下:#include <iostream>#include<string>#include&l…

    2022年8月18日
    9
  • java卸载 安装错误_Java卸载后无法重新安装 提示已安装过[通俗易懂]

    java卸载 安装错误_Java卸载后无法重新安装 提示已安装过[通俗易懂]龙歌这款游戏需要在玩之前安装一个java的插件,有时候由于错误的安装或卸载java会造成虽然已经删除了java插件,但是重新安装java时系统提示已经安装了一个版本,而无法重新安装。在Windows中,如果本地安装过Java,但存在问题无法使用,需要重新安装同版本的Java时,会出现下面的提示:原因是原有Java安装目录已经被删除或损坏了,不过在注册表还残留了安装信息,如果用360和优化大师清除注…

    2022年5月19日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号