Structure From Motion(SFM)入门讲解

article/2025/10/15 14:55:05
  • 概念

Structure From Motion(SFM) 是从一系列包含视觉运动信息的多幅二维图像序列中估计三维结构的技术。

  • SFM和立体视觉的区别

在立体视觉中,两个相机之间的相对位姿是通过标定靶精确标定出来的,在重建时直接使用三角法进行计算;而在SFM中该相对位姿是需要在重建之前先计算的。

  • 关键的公式

\huge x'Ex=0

式中:x′为右相机坐标系中的三维点坐标,x为左相机坐标系中的三维点坐标,E为本征矩阵。

式中:???为右相机内参矩阵的转置,??为左相机内参矩阵,?为基础矩阵。

式中:???为右相机图像坐标的转置,??为左相机图像坐标。

基础矩阵F将左右相机的图像坐标联系起来,该矩阵不仅包含了左右相机的相对位姿信息,也包含了左右相机的内参信息。

  • 算法流程

1)相机标定,获取相机内参;(我在大部分的博客中都没有有要求这一步,但是我感觉这一步应该有,因为本征矩阵和基础矩阵中都没有包含畸变信息,所以我认为在计算F之前,图像应该去畸变,但是使用了几个牛逼的sfm软件后,发现人家只需要把图片导入即可重建出三维点云,那么可想而知,应该是不需要进行标定了(也有一种可能是导入图片时使用特征点进行标定过了));

2)使用标定好的相机从多个角度拍摄同一场景图片,并按序号进行保存;

3)对相邻图像两两计算匹配特征点;一般首先使用两张图像进行重建,计算出一个初始的点云,之后不断添加后续的图像,具体添加哪一张图像的方法是:检查已有的图像中哪一个与已有点云中的点匹配最多,就选哪一张;

4)使用3)中计算好的对应点对计算基础矩阵F;

关于基础矩阵的推导可以参考multiview geometry 242页9.2.1;

5)通过基础矩阵计算本征矩阵;

6)通过本征矩阵计算两个视角之间的运动,即R,T;

这里参考Multiview geometry 258页9.6.2,但是由于符号的关系,会解出四种可能的[R|T]矩阵,因此,我们需要将所有的2D的点使用这四种映射分别映射到3D空间中去,看哪一种映射对应的3D点的z深度方向全部是正确的,因此,准确的[R|T]会使得所有的场景点都在相机朝向的正前方。

7)在计算出[R|T]矩阵后,就可以使用光学三角法对所有的特征点重建了。

 

案例

为了使该案例便于实现,本文使用了自己的小米手机来作为实验道具。

1)相机标定:使用opencv自带的相机标定api即可非常容易地对相机进行标定,抽时间我会提供相机标定的程序,以下为我采集的标定图像;

2)本次例程使用surf特征点来进行关键点的选取,因此使用opencv中SurfFeatureDetectordetector()函数分别检测相邻两幅图像中的关键点(实际使用中也可以使用其他的特征点提取方法);

SurfFeatureDetector detector;
vector<KeyPoint> key_pnt1,key_pnt2;
detector.detect(img1,key_pnt1);
detector.detect(img2,key_pnt2);

3)使用SurfDescriptorExtractor类计算关键点描述子;

SurfDescriptorExtractor extractor;
Mat descriptors1,descriptors2;
extractor.compute(img1,key_pnt1,descriptors1);
extractor.compute(img2,key_pnt2,descriptors2);

4)使用暴力匹配方法计算对应的匹配点;

BruteForceMatcher<L2<float>> matcher;
vector<DMatch> matches;
matcher.match(descriptors1,descriptors2,matches);

5)使用步骤4)计算好的匹配点计算基础矩阵F和本征矩阵;

Mat mask;
Mat F = findFundamentalMat(right_pnts1, right_pnts2, FM_RANSAC, 0.1, 0.99, mask);
Mat E = camera_param.t()*F*camera_param;
Mat R1, R2, T;
decomposeEssentialMat(E, R1, R2, T);

6)对本征矩阵进行奇异值分解计算相邻相机之间的相对位姿R、T,一共有四种:[R1,T],[R1,-T],[R2,T],[R2,-T];

但是只有一个是正确的,筛选的方法是:正确的R、T会使得最终计算出来的所有场景点的z坐标都是正的;

7)使用三角测量法计算特征点的三维坐标,或者使用立体视觉的方法计算视差图并进行场景重建.

 

大家好,我主要的研究方向有:
**1)主流的结构光三维测量方法,包括:线扫,格雷码,相移,散斑等;
2)摄像机标定和投影仪标定;
3)点云处理;
4)图像处理;
5)Halcon应用;
6)机器视觉相机选型。**
对以上研究方向感兴趣的朋友可以关注我的微信公众号:
 


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

相关文章

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

【更新】我的新博客&#xff1a;www.ryuzhihao.cc&#xff0c;当然这个csdn博客也会更新 本文在新博客中的链接&#xff1a;点击打开链接 完成时间&#xff1a;2017年2月27日 博客时间&#xff1a;2017年4月26日 去年&#xff0c;我有幸了解到image-based mode…

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

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

SFM算法介绍

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

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

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

SLAM和SFM有什么区别?

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

SFM问题简介

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

SfM详细流程介绍

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

主流SFM处理方式的梳理

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

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 机器…