三维重建之路下

#运动恢复结构SfM系统解析

#回顾

#本质矩阵与单应矩阵区别

image

#Global Bundle Adjustment

image

#P3P

已知内参矩阵,3个像素点坐标及对应三维点坐标,求RT image

#SfM系统问题描述

内参读取exif文件即可 image

#用欧式结构恢复(2视图)

image

#对应点计算--特征提取sift

image image

#对应点计算--特征匹配

其中计算出x'y'的128维描述子后,与左图找出的所有描述子计算距离,选出top2的点,再进行求比,防止x'y'与两个点都距离近,从而不好区分该匹配哪个点,所以直接不要。但是会出现特征点匹配错误的问题。 image 如果图像多、特征数多,用词袋模型,相同的单词就构成一对匹配。

#对应点计算--特征拟合 RANSAC

减轻特征点匹配的错误 image image

#求解步骤结束

  1. 对应点求解(SIFT特征提取+近邻匹配)
  2. 求解基础矩阵F (RANSAC+归一化八点法)
  3. 求解本质矩阵 (下面三步老方法即可)
  4. 分解本质矩阵
  5. 三角化

#基于增量法的SfM系统--OpenMVG(多视图)

image

#预处理

image

#增量法总体步骤

image

#计算轨迹

根据预处理的结果特征提取和特征匹配就可以构建轨迹 image

#计算共视图(连通图)

image

#G中选边e

选出初始两张图构建初始三维模型。图中是三维点在两幅图上的像素点 image

#两视图重构

t是轨迹中大于2的点,e是连通边上两张图所有的匹配点,取交集 image

#增量法
  1. 有了连通图,就由处理所有图片变成处理G中的边即可。

  2. 选取最大化是为了使得P3P结果更加鲁棒,因为新加入的图片与重建完的图片匹配的点最多,

  3. 通过前两幅图的像素点和三维点来构建新图片的位姿,因为新图片和旧图片的像素点是匹配的(track含义),所以旧图片的像素点和三维点的匹配可以推出新图片也跟该三维点匹配,由此再知道内参矩阵,就可以构建出位姿

  4. 就是把未构建三维点的像素点拿来三角化(并且是tracks中的点)

  5. 删边

  6. 优化结果

image

#补充知识

#词袋模型

  1. 提取特征
    1. 数据库所有的图片找到所有sift特征点
    2. 聚类
  2. 学习视觉词典
    1. 考虑的问题:词典大小适中
    2. 计算效率:词汇树、AKM

image

  1. 利用视觉词汇出现的频率表达图像

image

#基于词袋模型的图像检索

image 搜索中使用相似性度量 image 排除无意义特征:TF-IDF image image

#SLAM系统解析

#优化问题

image

#生成树

image

#SLAM介绍

Simultaneous Localization and Mapping(SLAM):

  • Localization:传感器的位置和姿态;
  • Mapping:地图构建
  • SLAM:同时定位和建图
  • 应用场景:定位、导航、避障、重建、交互

SLAM传感器分类:

  • 携带于机器人本体上的,例如机器人的轮式编码器、相机、激光等;
  • 安装于环境中的,如导轨、二维码标志等;

按照相机的工作方式,相机可分为:单目(Monocular)、双目(Stereo)和深度相机(RGB-D) 地图: image 地图的用处 image

#ORB-SLAM

开源方案 image image

#数据结构与数据库

image 核心数据库内容: 地图点

  • 世界坐标系下的3D点坐标;
  • 观测方向,即所有可以观测到该特征点的视图所产生的观测方向均值;
    • 排除离特征点方向过大的视图,提高鲁棒
  • ORB特征描述子;
  • 该点能被观测到的最大距离与最小距离;
    • 排除离特征点过远过近的视图,提高鲁棒

关键帧

  • 摄像机位姿;
  • 内参数;
  • 该帧中提取到的全部ORB特征描述子(近似SIFT),以及它们和地图点之间的对应关系;
    • 没有对应关系的等待下次重建时再填充

共视图(近似OpenMVG连通图)

  • 一种有向无权图,节点为关键帧,如两个节点共享的地图点数量大于阈值(至少15个),则存在一条边,边的权重设置为共享地图点的个数。
    • 后续用于bundle adjustment优化

本质图

  • 是共视图的子图,保留所有节点,边数量相较于共视图更少,尽量减少边,其作用是加速回环校正的计算。 本质图=生成树+共视图边权重超过100的边+回环边
    • 回环边:检测中自己生成的边,把视图拉回正常视角的边
    • 生成树:Kruskal算法

#系统工作流程 ⭐

image

#跟踪

核心功能:1. 确定当前帧位姿(RT);2. 确定其是否将其作为关键帧

#地图初始化

image

#初始位姿估计

image

image 2.2 对于每一个候选参考关键帧: image

#位姿优化

运用优化问题中的位姿优化公式 image

#关键帧选取

image Kref来自于数据集中的某帧 (前一步位姿优化中出现)

#建图

该线程核心功能:完成局部地图构建

#关键帧插入

image

#地图点剔除

image

#新地图点生成

image

#局部地图优化

当前帧K1,共视关键帧K2,能看到但没有共视K3 image

#局部关键帧剔除

image

#回环校正

该线程核心功能:修正累计误差 image

#回环候选帧检测

image image 图中的第三步的绿云里红色圈假设就是关键帧,因为在前几帧里也出现了,然后选为候选帧

#计算Sim3变换

Sim3就是Sij image

#回环融合

image

#位姿优化

image

#总结

#摄像机几何

在针孔摄像机下,建立世界坐标系上的三维点到像平面坐标系上像素点的关系

  • 外参矩阵将世界坐标系转换到摄像机坐标系
  • 内参矩阵将摄像机坐标系上的空间点映射到像平面坐标上的像素点

image


#摄像机标定

通过已知二维点、三维点,利用p=MP求解摄像机内外参数矩阵,求出参数矩阵就可以应用摄像机几何 image image


#单视图几何

通过影消点和直线方向的关系,影消线和平面法向量的关系,摄像机几何(还是标定?)恢复三维场景结构 image

#求出内参矩阵

利用影消点和直线方向的关系,找到互相垂直的点得到$v_{1}^{T} \omega v_{2}=0 (\theta =90^\circ)$,然后利用$\omega$获得K矩阵 image

#求出平面法向量

求出K矩阵后利用影消线和平面法向量的关系,求出平面法向量 image

#求出三维场景

已知内参矩阵、平面法向量、利用摄像机几何(还是摄像机标定?)中三维点和像素点的转换关系,求得最终的三维重建,不考虑外参矩阵


#三维重建基础知识

#三角化

已知p, p', K, K', R, T,求三维点

  • 线性解法:奇异值分解
  • 非线性解法:牛顿法、L-M方法

#极几何

在同一场景下两个视点图像的几何关系:点线关系,点点关系,基础矩阵和极点关系 image 获得近似基础矩阵:归一化八点法 image

#P3P

image

#基于词袋模型的图像检索

image

#本质矩阵于单应矩阵

image

#Bundle Adjustment

image


#双目立体视觉

利用平行视图获取深度构建双目立体视觉系统

#将非平行视图转换为平行视图

image

#平行视图的双目立体视觉

  • 平行视图基础矩阵:$F = \begin{bmatrix} 0&0 &0 \ 0&0 &-1 \ 0&1 &0 \end{bmatrix}$
  • 平行视图的极线平行于u轴,p和p'的v坐标相等,因此沿着扫描线搜索即可
    • 对应点搜索使用归一化相关匹配,再加上一些约束
    • 由此构建点对应关系
  • 通过p'和p坐标,利用平行视图三角化公式$p_{u}-p_{u}^{\prime}=\frac{B \cdot f}{z}$,就可求出深度z
  • 有了深度,就可以形成深度图或者3D电影,构建双目立体视觉系统

#多视图几何

通过三维场景的多张二维图像,恢复出该场景的三维结构信息以及每张图片对应的摄像机参数

#欧式结构恢复

image 求解步骤:

  1. 求解基础矩阵F (归一化八点法)
  2. 求解本质矩阵 $(E=K_{2}^{T} F K_{1})$
  3. 分解本质矩阵
    1. image
  4. 三角化 (线性法、非线性法)

#SfM系统

#欧式结构运动恢复(两视图)

image 欧式结构恢复(两视图)求解步骤:

  1. 对应点求解(SIFT特征提取+近邻匹配)
  2. 求解基础矩阵F (RANSAC+归一化八点法)
  3. 求解本质矩阵 $E=K_{2}^{T} F K_{1}$
  4. 分解本质矩阵 $E \rightarrow R, T \rightarrow M_{2}$
  5. 三角化

#增量法(OpenMVG)(多视图):

image image


#SLAM系统

同时摄像机定位和构建三维模型 image image