三维重建(7)--运动恢复结构SfM系统解析

目录

一、SfM系统(两视图)

1、特征提取

2、特征匹配

3、RANSAC求解基础矩阵F 

4、完整的欧式结构恢复算法流程

二、基于增量法的SfM系统(以OpenMVG为例)

1、预处理 

2、图像特征点提取与匹配

3、两视图重构点云

4、增加新视图,多视图重构


一、SfM系统(两视图)

        对于欧式结构恢复的两视图问题,需要获得三维场景的m张图像的像坐标作为已知条件,求解三维场景结构(即三维点坐标),m个摄像机的外参数R和T。所以现在的问题在于如何标注m张图像的像坐标的对应关系,将摄像机拍摄的照片转换成已知条件。

        图像的像坐标对应关系可以转换为特征提取特征匹配两个部分。

1、特征提取

         特征提取:通过输入m张不同摄像机拍摄同一场景的图片,输出具有尺度不变性的特征点,即尺度不变特征转换(SIFT转换),

        SIFT算法特点:具有尺度不变性、能够适应旋转图像,改变图像亮度,移动拍摄位置的变化,能在一定程度上不受视角变化、仿射变换、噪声的干扰。

        

        SIFT算法实现特征提取的流程:提取尺度不变的区域(高斯微分函数),进行尺寸归一化和旋转归一化,对特征点区域计算特征方向,进行两两比较找出相互匹配的若干对特征点,建立两个像平面之间特征点的对应关系。

2、特征匹配

        对于二视图的特征匹配而言,首先使用特征提取器对两幅图像进行特征提取,提取出的特征点可能不同,对于下图,假设我们找右图特征点在左图的对应点。

        首先,选择一个右图中的特征点i,并计算左图所有特征点的一个相似度度量(比如余弦相似度度量),并选择这其中top2距离小的两个左图特征点j_1,j_2,并记录j_1,j_2与特征点i之间的距离d_1,d_2

        计算距离比d_1/d_2(指定小的数除以大的数),如果其小于某个给定阈值(如0.6),则认为右图特征点i与左图特征点j_1是一对对应点,这步算法的设计,如果说d_1/d_2较大,趋于1,则说明左图两个特征点之间较近,越说明左图两个特征点与右图特征点i建立的两组对应关系很难辨认,极为接近,所以我们不作为匹配对象,这更容易引入噪声。

        我们应该注意的是,特征匹配是为了后续求解基础矩阵F进行准备的。

3、RANSAC求解基础矩阵F 

         RANSAC求解基础矩阵的方法是对归一化八点法估计基础矩阵F的扩充,为了进一步去减少离群点和噪声,我们在求解基础矩阵时,可以使用RANSAC方法来充分排除离群点对求解基础矩F的干扰,提高估计的准确性和鲁棒性。

4、完整的欧式结构恢复算法流程

        对于欧式结构恢复问题,一般假设摄像机1与世界坐标系不存在旋转平移关系,即外参数为[I \hspace{0.2cm} 0],摄像机2与世界坐标系存在R,T关系,即外参数为[R \hspace{0.2cm}T],换言之摄像机2与摄像机1之间存在[R \hspace{0.2cm}T]关系。

        算法流程: 

(1)对应点计算(特征提取+特征匹配)

(2)求解基础矩阵F(RANSAC+归一化八点法)

(3)求解本质矩阵E

(4)分解本质矩阵E\rightarrow R,T\rightarrow M_2

(5)三角化

二、基于增量法的SfM系统(以OpenMVG为例)

        基于增量法的SfM系统流程:图像特征点提取与匹配->两视图重构初始点云->增加视图到系统实现多视图重构

        算法流程如下: 

1、预处理 

        预处理工作:图像特征点提取与近邻匹配,基于RANSAC的基础矩阵或单应矩阵的估计。

为什么要估计基础矩阵的同时估计单应矩阵?

        由于我们不能确定所取的特征点在世界坐标系下有没有很多是同一平面的点,如果同一平面的点较多,那么使用单应矩阵的估计后去计算本质矩阵E的误差要小很多,受到噪声的影响也很小。所以利用RANSAC来估计基础矩阵和单应矩阵,如果単应矩阵求解更容易拟合则使用単应矩阵。

2、图像特征点提取与匹配

(1)计算对应点的轨迹t

        对应点的轨迹:多个像平面下对应特征点的连线,在OpenMVG中只保留关联至少三张图片的特征点的连线。

 (2)计算连通图G

        连通图:这里的连通图指的是以图片作为结点,两个图片之间匹配特征数量达到某一阈值则作为一条边,未达到阈值则不构成边。

3、两视图重构点云

(1)在G中选取一条边e

        在连通图G中的多条边里,选取一条特殊的边,这条边的两个节点对应的两个图像满足:这两个图像的对应点三角化时的射线夹角中位数不大于60度且不小于3度,此时能保证这两个摄像机即不会离的太近容易同时丢失太多信息,也不会离的过远而导致对应点对偏少。

(2)后续过程

        接下来的三步:鲁棒估计本质矩阵E,分解本质矩阵E,三角化,都是两视图重构的流程,在这里不再重复介绍。       

        删除G中的边e:这一步也很好理解,由于我们使用了这个边进行两视图重构,那么后续将不再用这条边。

4、增加新视图,多视图重构

        当G中存在其他边时,进行多视图重构。

        选择一条G中的边e,满足该边的track(e)∩ {已重建3D点}最大化,即这条边所关联的两个图像的对应点对,为所有剩余边中最大的,优先选择该边。

        用PnP方法,对边e所对应两个图像中,未进行重建摄像机位姿的图像一方进行重建摄像机位姿。

        然后,三角化新的tracks,删除G中的边e,并执行捆绑调整操作。

        每一次引入新的视图,将执行一次捆绑调整操作,可以对世界坐标的三维点进行不断拟合。

Reference:https://www.bilibili.com/video/BV1DQ4y1e7x6/?spm_id_from=333.999.0.0&vd_source=2152dec20715e478285cc87cc31201ed

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/247262.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LPC系列一个定时器不同频率

1.背景 最近研究的LPC804里只有一个ctimer,很多时候用的捉襟见肘的,官方给了一份双匹配的参考例程,不过实际用处不大。不过我花了一晚上的时间,终于研究出来将一个定时器拆成四个定时器用的办法了。这个方法适用于用回调函数的LP…

RabbitMQ(一)

1、相关概念 1.1、消息队列(MQ) MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是message 而已,还是一种跨进程的通信机制,用于上下游传递消…

移动Web——平面转换-多重转换

1、平面转换-多重转换 多重转换技巧&#xff1a;先平移再旋转 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name&qu…

数据结构——链式二叉树

目录 &#x1f341;一、二叉树的遍历 &#x1f315;&#xff08;一&#xff09;、前序遍历(Preorder Traversal 亦称先序遍历) &#x1f315;&#xff08;二&#xff09;、中序遍历(Inorder Traversal) &#x1f315;&#xff08;三&#xff09;、后序遍历(Postorder Traver…

scrapy的入门使用

1 安装scrapy 命令: sudo apt-get install scrapy或者&#xff1a; pip/pip3 install scrapy2 scrapy项目开发流程 创建项目: scrapy startproject mySpider生成一个爬虫: scrapy genspider itcast itcast.cn提取数据:     根据网站结构在spider中实现数据采集相关内…

centos系统安装Ward服务器监控工具

简介 Ward是一个简约美观多系统支持的服务器监控面板 安装 1.首先安装jdk yum install java-1.8.0-openjdk-devel.x86_64 2.下载jar wget 3.启动 java -jar ward-1.8.8.jar 体验 浏览器输入 http://192.168.168.110:4000/ 设置服务名设置为:myserver 端口号:5000 点击…

WSL2 Debian系统添加支持SocketCAN

本人最近在使用WSL2&#xff0c;Linux系统选择的是Debian&#xff0c;用起来很不错&#xff0c;感觉可以代替VMware Player虚拟机。 但是WSL2 Debian默认不支持SocketCAN&#xff0c;这就有点坑了&#xff0c;由于本人经常要使用SocketCAN功能&#xff0c;所以决定让Debian支持…

开始学习第二十五天(番外)

今天分享一下写的小游戏啦 头文件game.h #include<stdio.h> #include<time.h> #include<stdlib.h> #define H 3 #define L 3 void InitBoard(char Board[H][L], int h, int l); void DisplayBoard(char Board[H][L], int h, int l); void playermove(cha…

【LeetCode: Z 字形变换 + 模拟】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

5G_RACH(一)

什么是RACH RACH 代表 Random Access Channel。这是开机时UE发给eNB的第一条消息。 为什么选择RACH &#xff1f;&#xff08;RACH 的功能是什么&#xff1f; 当你第一次听到RACH或RACH Process这个词时&#xff0c;你脑海中浮现的第一个问题是“为什么是RACH&#xff1f;”…

Windows XP x86 sp3 安装 Google Chrome 49.0.2623.112 (正式版本) (32 位)

1 下载地址&#xff1b; https://dl.google.com/release2/h8vnfiy7pvn3lxy9ehfsaxlrnnukgff8jnodrp0y21vrlem4x71lor5zzkliyh8fv3sryayu5uk5zi20ep7dwfnwr143dzxqijv/49.0.2623.112_chrome_installer.exe 2 直接 双击 49.0.2623.112_chrome_installer.exe 安装&#xff1b; 3 …

Redis6基础知识梳理~

初识NOSQL&#xff1a; NOSQL是为了解决性能问题而产生的技术&#xff0c;在最初&#xff0c;我们都是使用单体服务器架构&#xff0c;如下所示&#xff1a; 随着用户访问量大幅度提升&#xff0c;同时产生了大量的用户数据&#xff0c;单体服务器架构面对着巨大的压力 NOSQL解…

SpringBoot之JWT登录

JWT JSON Web Token&#xff08;JSON Web令牌&#xff09; 是一个开放标准(rfc7519)&#xff0c;它定义了一种紧凑的、自包含的方式&#xff0c;用于在各方之间以JSON对象安全地传输信息。此信息可以验证和信任&#xff0c;因为它是数字签名的。jwt可以使用秘密〈使用HNAC算法…

10. UE5 RPG使用GameEffect创建血瓶修改角色属性

前面我们通过代码实现了UI显示角色的血量和蓝量&#xff0c;并实现了初始化和在数值变动时实时更新。为了测试方便&#xff0c;没有使用GameEffect去修改角色的属性&#xff0c;而是通过代码直接修改的数值。 对于GameEffect的基础&#xff0c;这里不再讲解&#xff0c;如果需要…

《动手学深度学习(PyTorch版)》笔记4.4

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过。…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Swiper容器组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Swiper容器组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Swiper容器组件 滑块视图容器&#xff0c;提供子组件滑动轮播显示的能力。…

漏洞原理MySql注入 Windows中Sqlmap 工具的使用

漏洞原理MySql注入 SQLmap是一款开源的自动化SQL注入工具&#xff0c;用于检测和利用Web应用程序中的SQL注入漏洞。以下是SQLmap工具的使用总结&#xff1a; 安装和配置&#xff1a;首先需要下载并安装SQLmap工具。安装完成后&#xff0c;可以通过命令行界面或图形用户界面来使…

Kafka-服务端-GroupMetadataManager

GroupMetadataManager是GroupCoordinator中负责管理Consumer Group元数据以及其对应offset信息的组件。 GroupMetadataManager底层使用Offsets Topic,以消息的形式存储Consumer Group的GroupMetadata信息以及其消费的每个分区的offset,如图所示。 consumer_offsets的某Partiti…

C#算法(11)—求三个点构成圆的圆心坐标和半径

前言 我们在上位机开发领域也经常会碰到根据三个点求出圆的圆心、半径等信息的场景,本文就是详细的介绍如何根据三个点使用C#代码求出三点构成的圆的圆心坐标、圆半径、三点构成的圆弧的角度。 1、3点求圆分析 A、B、C三个点都是圆上的坐标点,过向量AB做中垂线,过向量AC做…

RabbitMQ“延时队列“

1.RabbitMQ"延时队列" 延迟队列存储的对象是对应的延迟消息&#xff0c;所谓“延迟消息”是指当消息被发送以后&#xff0c;并不想让消费者立刻拿到消息&#xff0c;而是等待特定时间后&#xff0c;消费者才能拿到这个消息进行消费 注意RabbitMQ并没有延时队列慨念,…