惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
H
Help Net Security
云风的 BLOG
云风的 BLOG
Apple Machine Learning Research
Apple Machine Learning Research
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
D
Docker
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Blog — PlanetScale
Blog — PlanetScale
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
GbyAI
GbyAI
博客园 - Franky
B
Blog RSS Feed
Stack Overflow Blog
Stack Overflow Blog
L
LangChain Blog
量子位
V
Visual Studio Blog
Y
Y Combinator Blog
小众软件
小众软件
N
Netflix TechBlog - Medium
博客园 - 三生石上(FineUI控件)
Microsoft Security Blog
Microsoft Security Blog
雷峰网
雷峰网

又见苍岚

COLMAP PatchMatch Stereo 算法详解 事件驱动的状态机框架:从理论到工程实践 Git 在国内网络环境下无法 Push 的排查与修复 —— 配置 Clash 代理 分段五次多项式插值原理详解 路径插值方法深度对比研究 Claude Code 使用指南 OpenClaw 记忆管理与技能创建指南 CBS(Conflict-Based Search)算法详解 A* 算法及其变种详解 OpenClaw 配置多 Agents Windows Powershell 无法加载文件,因为在此系统上禁止运行脚本问题的解决方案 MaxClaw 安装流程 大模型 AI 名词介绍 AList 网盘聚合工具简介 Protobuf 简介与测试 Claude Code 简介以及 GLM 4.7 模型接入 Github 歌词下载工具 163MusicLyrics Python __getattr__ 懒加载 Python TypedDict 机器人仿真平台 Gazebo 安装记录 机器人仿真平台 Gazebo 简介 多机器人路径规划问题(Multi-Agent Path Finding, MAPF)简介 Python exifread 读取修改过的 jpeg 信息错误问题修复 3D 坐标系变换的理解 3D 旋转矩阵基本概念 MongoDB Compass 介绍 Python 环境管理工具 uv Flutter 开发指南 Snipaste 安装下载与黑屏问题解决方案 全局路径规划算法记录
Structure from Motion
Yiwei Zhang · 2024-10-15 · via 又见苍岚

SFM,即Structure from Motion,中文常称为“运动恢复结构”,是一种计算机视觉技术,本文记录简要流程。

方法流程

  1. 特征提取
  2. 特征匹配、建立 track
  3. 找初始化像对
  4. 初始化像对的相对定向
  5. Bundle Adjustment

流程简介

特征提取

一般采用SIFT算子,因其具有尺度和旋转不变性

匹配和建立 track

匹配

图像对两两匹配,一般采用欧式距离.有两种方法:

  1. 粗暴匹配:对所有特征点都穷举计算距离
  2. 邻近搜索:建立KD树,缩小搜索范围,能提高效率,但也有可能不是最优,所以邻域取值是关键,越大越准确,越大计算量越大

当距离小于一定阈值的时候就认为匹配成功,但是误匹配也比较多,需要采取多种手段剔除:

  1. 如果最近距离与次近距离的比值大于某个阈值,应该剔除

  2. 对匹配点采用采样一致性算法RANSC八点法计算基础矩阵,剔除不满足基础矩阵的匹配对

track 列表

当匹配关系建立后,需要生成track列表,指同名点的相片集合,比如第一幅图的13号点和第二幅的14号点及第五幅的115号点是同名点,则(1,13)、(2,14)、(5,115)是属于一个track,据此可以生成一个track集合,同时生成track的时候也需要剔除无用匹配:

  1. 如果一个 track 包含同一幅图多次,则应该剔除,这是因为同一幅图的多个特征点都匹配了同一个点,则匹配关系肯定是错误的

  2. 如果track太少,应该剔除,一般取2,是指只有两幅图有同一个点,三维重建的信息过少,容易产生误差

找初始化像对

目的是找到相机基线最大的像对,采用RANSC算法四点法计算单应矩阵,满足单应矩阵的匹配点称为内点,不满足单应矩阵的称为外点, 根据单应矩阵公式可知当T越小时,内点占比越高,也就是低视差现象越明显。

因此找到一个内点占比最小的像对就是初始化像对,当然它前提必须满足可重建,这个可以通过匹配点个数保证

初始化像对的相对定向

根据RANSC八点法计算本征矩阵,可通过对本征矩阵SVD分解得到第二个图像的R、T,在这一步需要进行畸变校正,然后根据R、T和矫正后的像点坐标三角计算出三维点,这里用到的方法是直接线性变换DLT,可以理解为测绘中的前方交会

Bundle Adjustment

光束法平差Bundle Adjustment,是一个非线性优化的过程,目的是使重建误差降低到最小,通过调整POSE和三维点使反向投影差最小,如果相机没有标定,还应该将焦距也参与平差。

Bundle Adjustment是一个迭代的过程,在一次迭代过后,将所有三维点反向投影到各自相片的像素坐标并分别与初始坐标比对,如果大于某个阈值,则应将其从track中去掉,如果track中已经小于2个了,则整个track也去掉,一直优化到没有点可去为止

加入更多图像,以第三副图为例,根据第四步生成的三维点和第三副图与前两图的track关系,可以反算第三副图的R、T,然后继续三角化计算出更多的三维点,采用的同样是DLT,这样反复重复第5步,最后就会把所有像片的POSE(R、T)和三维点,这就是稀疏重建SFM的成果了

资源

目前,sfm开源库主要有:

不过,还有个小型库非常适合学习,用opencv实现的,地址是:

参考资料

文章链接:
https://www.zywvvd.com/notes/3d/sfm/sfm/