三维重建(4)--三维重建与极几何

目录

一、三维重建基础

1、线性解法 

2、非线性解法

3、多视图几何的关键问题 

二、极几何

1、极几何关系 

2、极几何特例

3、本质矩阵 

4、本质矩阵的性质

5、基础矩阵

6、基础矩阵的性质

7、基础矩阵的作用 

三、基础矩阵估计

1、八点法

2、归一化的八点法 

四、单应矩阵 


一、三维重建基础

        下图中表示,两个摄像机对同一个物体进行拍摄,两个摄像机之间存在旋转平移的关系,但由于噪声的存在,两条直线通常不相交,我们应该如何通过两个摄像机像平面的点p和p'以及两个摄像机内参数K和K',三角化的矩阵R和T,来计算世界坐标系下的P点的坐标。

1、线性解法 

       通过摄像机模型关系我们可以得到:

                                ​​​​​​​        ​​​​​​​        \left\{\begin{matrix} p=MP=K[I \hspace{0.25cm} 0]P\\ \hspace{0.4cm}p'=M'P=K'[R \hspace{0.25cm} T]P \end{matrix}\right.

        那么我们可以根据上面的式子,对于同一个点以及两个像平面点之间的对应关系,写出四个齐次方程,但是未知数只有三个,所以是一个超定齐次线性方程组,可以用齐次方程的最小二乘解来进行计算。

2、非线性解法

        非线性解法对于下图来说,由于存在噪声,对于P点再两个平面的投影MP和M'P*与真实的像平面p和p'存在一定的误差,所以寻找min{d(p,MP)+d(p',M'P)}的值,仍然是一个齐次非线性方程组的问题,所以用牛顿法和L-M方法来求解。

3、多视图几何的关键问题 

        摄影机几何:从一张或多张图像中求解摄像机的内外参数

        场景几何:通过二至多幅图片寻找3D场景坐标

        对应关系:已知一个图像的p点,如何在另一个图像上找到p'点

二、极几何

1、极几何关系 

       极几何:描述同一场景或者物体的两个视点图像间的几何关系。极几何主要解决的就是多视图几何的第三个问题——p与p'的对应关系。

        对于下图,两个平面就是指两个视点图像,也就是两个摄像机的像平面。

        极平面:过点P,O_1,O_2的平面,也就是P,p,p'所组成的平面,这两个平面相似。

        基线:O_1,O_2的连线

        极线:极平面与成像平面的交线即pe,p'e'直线

        极点:基线与成像平面的交点e,e'

        存在以下性质:

(1)极平面相交于基线,应该是基线在极平面上

(2)极线相交于极点

(3)对于不同的世界坐标点P和点Q,在两个像平面的极点e,e'不变

(4) p的对应点在另一个相机的极线l'上(对应点指的是两个相机之间的三角化R,T对应关系)

(5)p'的对应点在另一个相机的极线l上

2、极几何特例

(1)平行视图

        平行视图是指两个摄像机之间三角化没有旋转关系,只有u轴的横向平移关系,基线平行于图像平面,两个极点位于无穷远处,极线平行于图像坐标的u轴。

(2) 前向平移

        前向平移建立在两个摄像机具有两个方向的平移关系,但仍然保持极点位置相同,注意不是说同一个物体在同一个位置上。

        通过极几何的约束,可以将搜索范围缩小到对应的极线上,而并没有做到对应点,所以存在一个方向上的误差问题。 

3、本质矩阵 

        本质矩阵:对规范化摄像机拍摄的两个视点图像间的极几何关系进行代数描述。

        本质矩阵的关系表达式:E=T \times R,其中摄像机1经过平移T变换,旋转R变换得到摄像机2。对于世界坐标的点P投影到摄影机1的像平面p点,投影到摄像机2的像平面p'点有下面关系成立:p'^T[T \times R]p=0,即p'^TEp=0,如何证明?

        我们假设有两个像平面I和I',O_1,O_2分别为像平面的原点,图像I上点p的像素坐标为(u,v),图像I'上的点p'像素坐标为(u',v'),假设两个相机均为规范化相机则两者的投影矩阵M均等于I,并使得两摄像机内参数相等K=K'=I,此时对于世界坐标系的欧式坐标和两个图像点上的齐次坐标必然一致。

        我们知道任意一个I的点p经过R,T变换得到I上的点p' ,我们可以描述为Rp+T=p',由于旋转矩阵R是一个正交矩阵,其转置等于其逆,有R^TR=I,所以可以推出p'在O_1的坐标。

        注意O_1,O_2点均为该像平面坐标系下原点,所以令p'等于0,可以得到O_2O_1的坐标。

        由于我们在O_1坐标系下,p' \times O_2为垂直于l的方向,而p点在l直线上,所以p\perp l,有p \cdot l=0,所以推出p'^T[T \times R]p=0

4、本质矩阵的性质

(1)p对应的极线是l',对应关系l'=Ep

(2)p'对应的极线是l,对应关系l=E^Tp'

(3)Ee=0,e'^TE=0

(4)E是奇异的,rank为2

(5)E有5个自由度 (三个平移三个旋转,由于行列式为0,去掉一个自由度)

5、基础矩阵

        基础矩阵就是一般化摄像机情况的本质矩阵,但仍然排除外参数的问题,只考虑内参数。

        基础矩阵数学表达:F=K'^{-T}[T_{\times}]RK^{-1},此时满足p'^TFp=0

基础矩阵推导

        由于两个不同的摄像机,所以定义不同的内参数K和K',相较于规范化相机,对一般相机的像平面上的点p_c,p_c'有下面关系成立:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        p_c=K^{-1}p,\quad p'_c=K'^{-1}p'

        沿用本质矩阵中的推导,仍然能推出p'^TFp=0,注意此时是F而不是E。

6、基础矩阵的性质

        基本上性质与本质矩阵相似,只不过由于多了两个参数K和K'所以为7个自由度。 

7、基础矩阵的作用 

        通过基础矩阵,我们无需知道两个摄像机的内外参数,(外参数只有两个摄像机之间做了三角化,摄像机1与世界坐标之间没有旋转平移关系),就可以建立相同场景在不同视图的对应关系,基础矩阵中包含了摄像机内参数信息。

三、基础矩阵估计

1、八点法

        首先由于p'^TFp=0,我们可以转化成W \tilde{F}=0的齐次形式,此时我们定义新的列向量参数为\tilde{F},由于参数列向量\tilde{F}一共有8个有效值,所以我们只需要找8组点就可以解这个齐次线性方程组。

        解齐次线性方程组,仍然可以用齐次线性方程组的最小二乘解,通过找大于8个点,通过求解一个SVD问题即可。

        但此时有一个问题,当前的 \tilde{F}与基础矩阵F并不一致,这个不一致不是\tilde{F}不是一个3*3矩阵的形式,这一方面可以通过reshape来修改,但由于多组点不一定均为正确点,噪声点的出现,可能导致\tilde{F}矩阵的秩为3,而一般基础矩阵F的秩为2,所以我们要进行秩2校正。

        通过寻找 min||F-\tilde{F}||_F \quad s.t \hspace{0.2cm}det(F)=0,求解新的经过校正的\tilde{F},可以与真实的基础矩阵F之间有很小的误差。

        下面为八点法流程:

2、归一化的八点法 

        由于计算八点法求齐次线性方程组的最小二乘解过程中,参数之间数值差异过大,导致精度较低,误差较大,所以对八个点进行归一化处理。

        对每幅图像施加变换T(平移与缩放),让其满足原点为图像上八个点的重心,各个点到坐标原点的均方根距离均为\sqrt{2},所以主要是计算两台摄像机的两幅图像中的T和T'。

        归一化八点法的流程:

四、单应矩阵 

       单应矩阵的前提是空间平面的多个点均在同一平面上,即空间平面在两个摄像机下的投影几何。

        单应矩阵的重要结论:H=K'(R+t\textbf{n}_d^T)K^{-1},其中,\textbf{n}_d=\frac{n}{d} ,证明如下:

单应矩阵H有什么作用? 

        单应矩阵可以得到p和p'的点对点对应关系:p'=Hp

        H只有8自由度,只需要4对点的对应关系,即可计算出H,这样就可以计算出两者的关系,相较于基础矩阵更加简单,但要求也更多,世界坐标系的点必须在同一平面上。

 Reference:https://www.bilibili.com/video/BV1dr4y1C7nf/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=2152dec20715e478285cc87cc31201ed

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

138.随机链表的复制(附带源码)

目录 一、思路分析 二、如何操作 三、源码 深拷贝:原封不动的拷贝一份 一、思路分析: 这一题,偏向于技巧性。如果是按照工科思维硬推,那会非常头大,脑袋瓜疼。 这一题目的核心难点在于:处理random指针…

BP蓝图映射到C++笔记1

教程链接:示例1:CompleteQuest - 将蓝图转换为C (epicgames.com) 1.常用的引用需要记住,如图所示。 2.蓝图中可以调用C函数,也可以实现C函数 BlueprintImplementableEvent:C只创建,不实现,在蓝图中实现 B…

日常常见应用组件升级记录

一、前言 因近期安全扫描,发现java后端应用涉及多个引用组件版本过低,涉及潜在漏洞利用风险,特记录相关处理升级处理过程,以备后续确认; 二、升级处理过程 2.1、Java类应用内置Spring Boot版本升级 Spring Boot是一…

python实现图片式PDF转可搜索word文档[OCR](已打包exe文件)

目录 1、介绍 1.1、痛点 1.2、程序介绍 2、安装方式 2.1、🔺必要环节 2.2、脚本安装 2.2.1、不太推荐的方式 2.2.2、节约内存的方式 2.3、⭐完整版安装 3、使用 3.1、最终文件目录 3.2、主程序 3.2.1、绝对路径 3.2.2、是否为书籍 3.2.3、⭐截取区域 …

SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务)

文章目录 前言1.痛点2.解决方案3.具体实现3.1搭建热配置服务3.2编写配置文件3.3搭建版本控制仓库3.4Eureka-Client引入以下依赖3.5Eureka-Client微服务编写以下配置bootstrap.yml提前加载3.6分别编写测试Controller3.7测试效果3.8下线场景压测 4.SpringCloudBus优化 前言 在上…

【Kafka】Kafka介绍、架构和概念

目录 Kafka介绍Kafka优势Kafka应用场景Kafka基本架构和概念ProducerConsumer/Consumer GroupBrokerZooKeeperTopicPartitionReplicasOffsetsegment Kafka介绍 Kafka是是一个优秀的分布式消息中间件,关于常用的消息中间件对比可参考文章:消息中间件概述。…

Linux用户空间和内核空间所有15种内存分配方法

在Linux操作系统中,内存管理是一个关键的系统功能。用户空间和内核空间分别使用不同的函数来申请内存。以下是用户空间和内核空间内存申请函数的详细列表: Linux用户空间内存申请函数 1. malloc() 函数: void* malloc(size_t size); 用于…

Android OpenGL EGL使用——自定义相机

如果要使用OpenGl来自定义相机,EGL还是需要了解下的。 可能大多数开发者使用过OpengGL但是不知道EGL是什么?EGL的作用是什么?这其实一点都不奇怪,因为Android中的GlSurfaceView已经将EGL环境都给配置好了,你一直在使用…

100天精通Python(实用脚本篇)——第113天:基于Tesseract-OCR实现OCR图片文字识别实战

文章目录 专栏导读1. OCR技术介绍2. 模块介绍3. 模块安装4. 代码实战4.1 英文图片测试4.2 数字图片测试4.3 中文图片识别 书籍分享 专栏导读 🔥🔥本文已收录于《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准…

Flowable 生成流程图

/*** 生成流程图** param processId 任务ID*/ RequestMapping("/diagram/{processId}") public void genProcessDiagram(HttpServletResponse response,PathVariable("processId") String processId) {InputStream inputStream flowTaskService.diagram(p…

redis优化系列(六)

本期分享redis内存过期策略:过期key的处理 Redis之所以性能强,最主要的原因就是基于内存存储。然而单节点的Redis其内存大小不宜过大,会影响持久化或主从同步性能。 可以通过修改配置文件来设置Redis的最大内存: maxmemory 1gb …

[翻译] Vulkan-Sample-MSAA (Multisample anti-aliasing)

原文 Aliasing是以低于原始信号采样率的采样率进行采样导致的。在图形学中,这个过程可以描述为:基于一个会产生artifacts的分辨率去计算像素值,从而在模型边缘产生锯齿。多重采样抗锯齿(Multisample anti-aliasing,MS…

vivado 接口、端口映射

接口 重要&#xff01;接口只能在“fpga”类型的&#xff1c;component&#xff1e;中定义。接口部分提供了<component>上所有可用物理接口的列表。<interfaces>部分包含嵌套在其中的一个或多个<interface>标记。一个接口是通过使用<port_map>标记由多…

[pytorch入门] 3. torchvision中的transforms

torchvision中的transforms 是transforms.py工具箱&#xff0c;含有totensor、resize等工具 用于将特定格式的图片转换为想要的图片的结果&#xff0c;即用于图片变换 用法 在transforms中选择一个类创建对象&#xff0c;使用这个对象选择相应方法进行处理 能够选择的类 列…

股东出资透明度提升:企业股东出资信息API的应用

前言 在当今商业环境中&#xff0c;股东出资信息的透明度对于投资者、监管机构以及企业自身的健康发展至关重要。随着企业信息公开化的推进&#xff0c;企业股东出资信息API应运而生&#xff0c;为各方提供了一个便捷、高效的信息获取渠道。本文将探讨企业股东出资信息API如何…

【动态规划】【广度优先搜索】【状态压缩】847 访问所有节点的最短路径

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 广度优先搜索 状态压缩 LeetCode847 访问所有节点的最短路径 存在一个由 n 个节点组成的无向连通图&#xff0c;图中的节点按从 0 到 n - 1 编号。 给你一个数组 graph 表示这个图。其中&#xff0c;graph[i] 是一个列…

03.时间轮

时间轮 1.为什么需要时间轮 海量的定时任务下&#xff0c;小顶堆时间复杂度比较高&#xff0c;性能差 2.时间轮是什么 时间轮这个技术其实出来很久了&#xff0c;在kafka、zookeeper、Netty、Dubbo等高性能组件中都有时间轮使用的方式 时间轮&#xff0c;从图片上来看&…

自定义数据集 - Dataset

文章目录 1. PASCAL VOC格式 划分训练集和验证集2. 自定义dataset 1. PASCAL VOC格式 划分训练集和验证集 import os import randomdef main():random.seed(0) # 设置随机种子&#xff0c;保证随机结果可复现files_path "./VOCdevkit/VOC2012/Annotations" # 指定…

Sentinel限流规则支持流控效果

流控效果是指请求达到流控阈值时应该采取的措施&#xff0c;包括三种&#xff1a; 1.快速失败&#xff1a;达到阈值后&#xff0c;新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。 2.warm up&#xff1a;预热模式&#xff0c;对超出阈值的请求同样是拒绝并抛…

网络安全的信息收集方法有哪些?

网络安全攻击中的信息收集是攻击者为了了解目标系统的弱点、配置、环境和潜在的防御措施而进行的活动。以下是一些常见的信息收集手段&#xff1a; 开放网络资源查询&#xff1a; 使用搜索引擎查找关于目标组织的信息&#xff0c;包括新闻稿、社交媒体帖子、官方网站等。通过W…