[转]基于图像的三维模型重建4——增量SFM
内容
- 几种BA的形式
- 同时优化相机和三维点
- 优化相机
- 只优化三维点
- 单目相机
- 增量运动恢复结构(Incremental SFM)
- 运动恢复结构的几个问题
几种BA的形式
数学模型

n个三维点和m个相机,一些三维点在相机上的投影点。i表示三维点的索引,j表示相机的索引。 u 表示观测点, u^ 表示理想点
根据当前相机参数和三维点的坐标计算投影点的位置,然后计算观察点和投影点之间的误差,之后通过优化的方法使这个误差最小,从而得到一个比较好的相机参数和三维点的坐标。
该模型是一个非线性的最小二乘。通常采用LM算法~LM算法是一种基于信頼域的算法,通过调整信頼域半径的大小,在最速下降法(使用一阶梯度)和牛顿法(使用二阶梯度,考虑全局)之间切换,更加鲁棒。LM算法的核心是构造增量正规方程,通过方程可以求出增量,然后根据增量对当前的方程进行更新。
如果当前误差比较大,减小信頼域,使方法趋近于牛顿法。如果当前误差比较小,增大信頼域,使方法趋近于最速下降法。

增量正规方程
将 J(θ) 进行排序,P1~P3对应三个相机,X1~X4对应四个三维点。x11是第1个点在第1个相机中的投影。如果4个点在三个相机里都有投影,那么可以得到12个观察点。每个点有x和y坐标,24行;列数为总参数的个数(3个相机x9+4个三维点x3=39)。
JT(θ)J(θ) 是很明显的分块矩阵(方阵)。方阵的行数和列数就是参数的个数。

同时优化相机参数和三维点
将信頼域加入其中,只对包含对角线的分块矩阵有影响。

解方程:

得到两个方程,解第一个方程可以得到相机参数的增量 δc ,将δc代入第二个方程可以得到三维点的增量δX。
求解这个方程可以使用共轭梯度法,因为这个方程是比较大的稀疏矩阵。
- 固定三维点坐标,优化相机参数(特殊场景1)
对于三维点的梯度均为0,δX=0。只计算δc。更新相机参数

- 固定相机参数(特殊场景2)
只计算三维点的坐标增量δX。在对三维点进行更新。

单目相机——内参数共享(特殊场景3)
使用同一个相机在不同角度拍摄同一物体。这种场景下,相机的内参一致。

在该模型中,所有的内参(f, k1, k2)一致,将内参从Cj中独立出来。因此这里的 Cj 只表示相机的外参(R, t)。
由于所有相机的内参数固定,所以总的参数个数为(3+6m+3n)。
对之前的Jacobian矩阵进行改变,加入对f, k1, k2的偏导数。

之前使用的 J(θ) 是一个稀疏矩阵。但是由于加入了对于内参数(f, k1, k2)的偏导数,内参数与每个观察点都有关联,因此其对每个观察点都有值。J(θ)的形式发生改变。

使用的求解方法与之前的求解方法类似。
运动恢复结构(SFM)
通过相机运动同时恢复相机参数(内外参数)和场景结构(三维点坐标)。

这里介绍的场景针对无序图像。有序图像的匹配复杂度会减少很多。无序图像经过SFM得到稀疏点云。之后还可以对其进行稠密的点云重建,对图像进行径向畸变的校正。
主要流程
- 输入图像
- 特征提取与匹配
- 图像连接图构建
- 捆绑调整优化相机姿态和场景结构
- 得到稀疏点云

将两两对应关系对齐到同一的坐标系。

通过特征检测得到特征点,对不同视角的特征点进行匹配。通过对极几何,筛选出外点,保留内点,通过内点拟合出模型,得到相机相对的姿态。
对极几何模型选择:

单应矩阵需要场景是平面,场景的深度很深,例如航拍。
图像连接图
连接图的顶点:每张图像
连接图的边界:两幅图像之间存在共同的可见区域(足够多的匹配内点)

每张图像看多一个节点,对所有图像进行两两匹配,如果两张图像存在足够多的匹配点,那么将两个图像连接起来,其连接线作为一条边界。最终可以得到一个很大的无向图。无向图的顶点是每张图像,边界是两张图像间的匹配关系。该无向图称为图像连接图。

- 顶点的大小与连接个数有关:一个顶点的邻域越多,顶点越大;
- 比较好的视角(相似的、正面光照条件好)集中在中央,偏一些的图像位于集中在边界;
- 白天成像和夜晚成像出现分块的情况。
Tracks
- 多个视角对应的匹配点连接起来


- 一个三维点(匹配点)对应着一个Track
计算Tracks(三维点+匹配关系)

已知图像中各特征点的位置和当前的相机姿态。如果我们知道两个以上特征点的位置,就可以计算三维点的坐标。
Track也可以用来计算相机姿态。
捆绑调整(BA)

相对的相机参数生成全局一致的相机参数和场景结构。
算法流程

图像连接图,去除末梢的图像,使用视角好的图像进行重建。
要先选择一个视角(一对相机)进行重建。
在这个视角之上,要不断添加新的视角。如何选择新视角是有标准的。
选择新视角后,要对当前的视角进行重建,得到相机参数,对单视角进行优化。这一步只对当前相机进行优化。优化后,track上多了匹配点,再进行滤波。
重建后,进行全局的捆绑调整。为了效率,几张图像调整一次。
增量的运动恢复结构
初始相机对的选取
选择一对图像
- 匹配点足够多(>=50)
- 基线足够长,三角量测的角足够大(>=5deg),$\alpha$为三角量测角
匹配对很多,如何对所有角进行衡量?使用所有夹角的平均值或找中值 - 满足homography尽量少(<60%)
- 成功三角化的匹配对>50%
保证匹配对足够可靠,匹配足够好。

RANSAC三角量测
目前一直相机的两个姿态。
- 使用三角量测,将tracks重建出三维点;
- 由于存在匹配外点,重建出错误的tracks,用RANSAC的方法排除外点

Tracks滤波
- 三维空间中太远的点:将三维点投影到像平面上;

- 重投影误差比较大的点:

Tracks滤波

全局的捆绑调整
目前具有三维点和相机姿态的初始值。

重建新的视角
- 选择新的视角
条件:可见的tracks数目最多。
将视角按照tracks由多到少进行排序。

- 恢复新建相机的姿态
1 找到3D-2D对应关系;
2 用RANSAC-PnP算法求解相机姿态。

目前,已知三维点坐标以及这些点在新的像平面上的坐标,求解新的相机外参,这是一个PnP的问题。
每次采样三个点,得到相机姿态。把其他的点通过刚求出的相机姿态投影到像平面,计算重投影误差。通过误差找到内点,统计内点个数,不断采样,直到内点个数最多。最后使用这些内点求出相机姿态。
- 单个相机的捆绑调整
相机姿态的非线性优化
- Tracks重建
增加视角后,会产生新的tracks(有超过两个视角的匹配点)

- Tracks滤波
重建后一定要进行滤波
- 全局的捆绑调整
增量捆绑调整的优缺点
优点:
- 对特征匹配外点鲁棒
- 重建精度高
- 捆绑调整不断优化场景结构
常用来做算法比较的基准
缺点:
- 对初始相机对的选取以及相机的添加顺序敏感
- 大场景产生累计误差导致场景漂移
- 重复进行捆绑调整,效率低
重建结果


开源工具:
Bundler:增量的捆绑调整
VisualSFM:加速版本的增量SFM
Theia
Colmap
焦距的获取
径向畸变系数一般直接设置为0。
- 自标定的方法获取初始值,如VisualSFM
- 从可交换图像文件中读取EXIF初始值,如Bundler

尺度不确定性
没有实际的距离。点云中1mm不是实际中的1mm。点云的单位需要使用GPS进行地理标注,相机使用GPS得到真实的地理坐标。

动态物体
标准的SFM只能重建场景中的动态物体,对物体进行运动补偿。

重复结构
由于描述子都是局部的,有很多的重复结构,会出现错误的匹配。

非朗伯面
朗伯面上的点朝每个方向的反射都是一样的。
而镜面或水面是非朗伯面,只在一个方向上的反射特别强,难以得到匹配点。
使用NCC的方法对局部的纹理进行匹配。

参考链接:基于图像的三维模型重建4——增量SFM
[转]基于图像的三维模型重建4——增量SFM的更多相关文章
- 相似图像识别检 —基于图像签名(LSH)
原文链接:http://grunt1223.iteye.com/blog/828192 参考:人工智能,一种现代方法 第 617页,且原始论文给出了完整的证明过程.在ANN方法中,LSH算一种可靠的紧 ...
- JPEG压缩图像超分辨率重建算法
压缩图像超分辨率重建算法学习 超分辨率重建是由一幅或多幅的低分辨率图像重构高分辨率图像,如由4幅1m分辨率的遥感图像重构分辨率0.25m分辨率图像.在军用/民用上都有非常大应用. 眼下的超分辨率重建方 ...
- CSharpGL(54)用基于图像的光照(IBL)来计算PBR的Specular部分
CSharpGL(54)用基于图像的光照(IBL)来计算PBR的Specular部分 接下来本系列将通过翻译(https://learnopengl.com)这个网站上关于PBR的内容来学习PBR(P ...
- ODI基于源表时间戳字段获取增量数据
实现目标:通过ODI获取一个没有时间戳的子表(qb_bw)的增量数据,而主表(qb_tb)有一个rksj入库时间,且主表和子表之间通过ID关联.目标表名是qb_bw1. 设计原理:通过在ODI的map ...
- 基于MySQL自增ID字段增量扫描研究
目录 目录 1 1. 问题 1 2. 背景 1 3. InnoDB表 2 3.1. 自增ID为主键 2 3.2. 自增ID为普通索引 4 3.3. 原因分析 7 4. MyISAM表 8 4.1. 自 ...
- Java + SikuliX 基于图像实现自动化测试
转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/6d2908e8.html 你好,我是测试蔡坨坨. 由于目前大多数GUI工具均需要依赖于程序类型进行特征属性识别,例如:Sel ...
- Redis基于eval的多字段原子增量计算
目录 目录 1 1. 前言 1 2. 优点 1 3. 方法一:使用struct 2 3.1. 设置初始值(覆盖原有的,如果存在) 2 3.2. 查询k1的值 2 3.3. 设置初始值(覆盖原有的,如果 ...
- jenkins+gitlab钩子+shell脚本基于git的tag实现App增量更新
转自:http://blog.csdn.net/kingboyworld/article/details/54175330 环境安装 jdk1.8 1.安装jenkins 首先到https://jen ...
- 基于图像二维熵的视频信号丢失检测(Signal Loss Detection)
1 图像二维熵 图像二维熵作为一种特征评价尺度能够反映出整个图像所含平均信息量的高低,熵值(H)越大则代表图像所包含的信息越多,反之熵值(H)越小,则图像包含的信息越少.对于图像信息量,可以简单地认 ...
- 基于图像切换器(imageSwitcher)的支持动画的图片浏览器
利用GridView和ImageSwitcher的基本用法 public class MainActivity extends Activity { int[] imageIds = new int[ ...
随机推荐
- oracle中排序分析函数row_number()、rank()、dense_rank() 的区别,与rownum的注意事项
row_number()产生的序号不会重复,即1.2.3... rank()产生的序号会重复,但是会跳号,出现1.2.2.4...的情况 dense_rank()产生的序号会重复,不会跳号,会出现1. ...
- 函数计算平台 OpenFunction 在自动驾驶领域的应用
嘉宾 | 霍秉杰 整理 | 王新 出品 | CSDN 云原生 2022 年 5 月 10 日,在 CSDN 云原生系列在线峰会第 4 期"ApacheSkyWalking 峰会"上 ...
- 快速部署sqlserver AlwaysOn集群
点击查看代码 丐版sqlserver集群 之前试过docker的,k8s的,然后发现,还是最朴素的是最简单的,希望有大佬能够汉化,他妈的,那些英文看得人要发癫啊. 前置准备,参照丐版pxc集群: ht ...
- 使用 FastGPT 工作流搭建 GitHub Issues 自动总结机器人
如今任何项目开发节奏都很快,及时掌握项目动态是很重要滴,GitHub Issues 一般都是开发者和用户反馈问题的主要渠道. 然而,随着 Issue 数量的增加,及时跟进每一个问题会变得越来越困难. ...
- 从入门到放弃,我们为何从 Blazor 回到 Vue
在我们团队的开发历程中,C# 和 .NET 框架一直是我们的主力语言,伴随我们走过了无数个项目.当微软推出 Blazor 这一革命性的框架时,我们对其充满了期待.Blazor 以其优良的架构和微软的强 ...
- NATAPP实现内网穿透简易教程
NATAPP是什么 NATAPP是一个十分容易上手的内网穿透工具,可以把本机的ip和端口映射到公网,将本机暴露在公网中供他人访问. 这在进行一些回调接口的本地测试(如支付宝微信支付的回调接口)时十分好 ...
- .NET Core 反射底层原理浅谈
简介 反射,反射,程序员的快乐. 前期绑定与后期绑定 在.NET中,前期绑定(Early Binding)是指在编译时就确定了对象的类型和方法,而后期绑定(Late Binding)或动态绑定是在运行 ...
- 硬件设计很简单?合宙低功耗4G模组Air780E—开机启动及外围电路设计
Air780E是合宙低功耗4G-Cat.1模组经典型号之一,上期我们解答了大家关心的系列问题,并讲解了选型的注意要点. 有朋友问:能不能讲些硬件设计相关的内容? 模组的上电开机,是硬件设计调试的第 ...
- 内网IP地址实现HTTPS加密访问教程
一.前期准备 确定内网IP地址: 确保有一个明确且固定的内网IP地址.动态IP地址可能不适合此场景,因为它们会频繁改变,导致SSL证书失效. 选择SSL证书颁发机构(CA): 选择一个受信任的CA,如 ...
- ExtJS & Asp.NET
企业应用中,要快速开发Web应用,前端使用ExtJS还行,包含许多常用的控件,图标,配色方案... 帖上部分载图: 完全可订制的登录界面: 可调整的布局: 可综合使用的模态对话框: 树结构及动态加载: ...