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

article/2025/10/15 14:56:32

【更新】我的新博客: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. 雕像

输入数据:

输出结果:

 

2. 紫薇树:

输入数据:

输出结果:

 

3. 矮灌木

输入数据:

输出结果:

写在前面:

 

       前面给出了三组测试用例的执行结果: 我的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必有的图片……)

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

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

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

这里需要提一下:

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

     外参矩阵的话:[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. 大致的实现流程如下:

祝大家好运。

 


http://chatgpt.dhexx.cn/article/rRcLYya1.shtml

相关文章

SFM(structure-from-motion)实现流程详细介绍

SFM(structure-from-motion)算法是一种基于各种收集到的无序图片进行三维重建的离线算法。顾名思义是从运动中(不同时间拍摄的图片集)恢复物体的三维结构,这需要估计出图片的R,t,结合相机内参重建稀疏点云。…

SFM算法介绍

背景 股票市场存在着短线、中长线、长线等不同频率的交易模式,这些交易活动决定了股票价格的变动。为了对股票价格进行预测,该文章提出了一种循环神经网络SFM,可以从股票价格的时序数据中捕捉多种频率的交易规律,从而做出短期/长…

增量式SfM详细流程介绍及实现方法

目前主流的SfM(Structure from Motion,运动结构恢复)可以分为两大类型,一种是全局式的,一种是增量式的。全局式(Global)sfm能够一次性得出所有的相机姿态和场景点结构。它通常先求得所有相机的位…

SLAM和SFM有什么区别?

点击上方“3D视觉工坊”,选择“星标” 干货第一时间送达 自古以来,人们惆怅千年要解决的问题: 定位、定向. 当然了还有我是谁?我在哪里? 在这个时候, SLAM与SFM 横空出世. 这两兄弟叱咤乾坤,成为人们解决上述问题的得力帮手. SFM SFM即Struct…

SFM问题简介

最近在学习opencv的知识,遇到的一些知识点和理解记录下来,由于还是小白,有所不对的地方,大家一起交流沟通 Structure from motion,简称为SFM,是单目相机在物体周围不同的角度拍摄不同的图片,而相…

SfM详细流程介绍

增量式(Incremental)sfm则是一边三角化(triangulation)和pnp(perspective-n-points),一边进行局部BA。这类方法在每次添加图像后都要进行一次BA,效率较低,而且由于误差累积,容易出现漂移问题;但是增量式sfm的鲁棒性较高。 增量式sfm初始化 初始化主要是指选取两张匹…

主流SFM处理方式的梳理

SFM是什么? SFM即Structure-from-motion运动结构重建,从大批量图像数据出发,通过相关处理,获取目标图像集3D几何(结构)和摄像机姿态(运动)信息,主要处理流程可分为如下几…

SFM过程(一)

以图像为基础的三维重建过程SFM基本如下图所示&#xff1a; 以SfM-Toy-Library代码为例&#xff0c;如下&#xff1a; ErrorCode SfM::runSfM() {if (mImages.size() < 0) {cerr << "No images to work on." << endl;return ErrorCode::ERROR;}//in…

SfM算法

参考 https://blog.csdn.net/kokerf/article/details/72630863 https://blog.csdn.net/qq_42399848/article/details/89348740 https://blog.csdn.net/lpj822/article/details/82716971 《基于无序图像集的运动恢复结构研究与实现》 Structure from Motion可以认为一个相机在运…

SFM算法流程

SFM算法流程 Figure1:Block diagram of structure from motion 1. 算法简介 SFM算法是一种基于各种收集到的无序图片进行三维重建的离线算法。在进行核心的算法structure-from-motion之前需要一些准备工作&#xff0c;挑选出合适的图片。 首先从图片中提取焦距信息(之后初始化…

Sfm方法过程及原理

1. 算法简介 SFM算法是一种基于各种收集到的无序图片进行三维重建的离线算法。在进行核心的算法structure-from-motion之前需要一些准备工作&#xff0c;挑选出合适的图片。 先从图片中提取焦距信息(之后初始化BA( Bundle adjust)需要)&#xff0c;然后利用SIFT等特征提取算法去…

SFM原理简介

Structure From Motion SFM简介 通过相机的移动来确定目标的空间和几何关系&#xff0c;是三维重建的一种常见方法。 它与Kinect这种3D摄像头最大的不同在于&#xff0c;它只需要普通的RGB摄像头即可&#xff0c;因此成本更低廉&#xff0c;且受环境约束较小&#xff0c; 在室…

SFM(Structure from Motion)一点总结

SFM&#xff08;Structure from Motion&#xff09;一点总结 运动结构恢复(Structure from motion)数十年来一直是计算机视觉领域的热门研究方向之一&#xff0c;实现了众多实际应用&#xff0c;尤其在近景三维重建中&#xff0c;该算法从获取的目标物系列影像出发&#xff0c…

sfm从运动到结构

sfm&#xff0c;即structure from motion。从一堆同一场景的照片中恢复场景的三维结构和照片拍摄时相机的位置&#xff0c;可分为全局sfm和增量式sfm。 全局sfm主要包括以下步骤&#xff1a; 1.提取各张照片上的特征点及其描述&#xff1b; 2.对所有照片相互进行特征点匹配&a…

猿创征文|SfM(Structure from Motion)学习之路

文章目录 0 前言1 理论基础1.1 书籍推荐1.2 SfM概述 2 动手实践2.1 增量式SfM复现总结2.2 部分复现结果2.3 遇到问题与解决 3 后续学习3.1 前沿论文阅读笔记3.2 Colmap使用问题3.3 三维旋转3.4 场景对齐 0 前言 一转眼&#xff0c;研究生生活已经过去两年了。开始接触SfM也是两…

SFM综述

Structure from Motion&#xff08;SfM&#xff09;是一个估计相机参数及三维点位置的问题。SfM方法可以分为增量式&#xff08;incremental/sequential&#xff09;,全局式&#xff08;global&#xff09;&#xff0c;混合式&#xff08;hybrid&#xff09;,层次式&#xff08…

计算机视觉之三维重建-SFM系统

SFM系统 1.PnP问题2. RANSAC拟合3.本质矩阵与单应矩阵4.sift特征提取*2视图欧式结构恢复求解流程*openMVG系统Tracks联通图计算流程 北邮三维重建课笔记 1.PnP问题 PnP问题&#xff1a;就是利用其中两个相机算出三维点坐标&#xff0c;再利用三维点坐标和第三个相机的像平面坐标…

java中浮点数表示方式

java虚拟机中的浮点数分为float和double两种&#xff0c;分别为32位和64位.它参考了IEEE 754的规范对浮点数进行处理。下面以float为例 &#xff0c;分析一下float数的表示方法. float的32位分成三个部分来表示一个浮点数: 浮点数的取值计算公式为: 解析: 1&#xff09; 当…

一文读懂 IEEE754 浮点数的表示方法

FBI WARNING&#xff1a;鄙人首个开源电子书 《Go 编码建议》已经上线啦&#xff0c;欢迎各位大佬斧正指导&#xff0c;协同共建。 文章目录 1.浮点数的存储格式2.移码3.浮点数的规格化3.1 单精度浮点数真值3.2 双精度浮点数真值 4.浮点数的具体表示4.1 十进制到机器码4.2 机器…

浮点数表示(IEEE 754)

引入 N S r j N Sr^j NSrj N&#xff1a;浮点数S&#xff1a;尾数r&#xff1a;基数j&#xff1a;阶码 举个例子&#xff1a; 123.456 1.23456 1 0 2 123.456 1.2345610^{2} 123.4561.23456102 其中123.456是浮点数&#xff0c;1.23456是尾数&#xff0c;10是基数(10进…