当前位置: 首页 > news >正文

多视图几何--恢复相机位姿/内参的几种方法

恢复相机位姿的几种方法

1分解投影矩阵

1.1投影矩阵分解为相机内外参矩阵的完整解析

投影矩阵(Projection Matrix)是计算机视觉中将三维世界点映射到二维像素坐标的核心工具,其本质是相机内参矩阵(Intrinsic Matrix)和外参矩阵(Extrinsic Matrix)的联合作用。


一、投影矩阵的数学构成

投影矩阵 P P P 是一个 3 × 4 3 \times 4 3×4 的矩阵,其表达式为:
P = K ⋅ [ R ∣ t ] P = K \cdot [R \ | \ t] P=K[R  t]
其中:

  • K K K 是内参矩阵( 3 × 3 3 \times 3 3×3),包含焦距 f x , f y f_x, f_y fx,fy 和主点坐标 ( c x , c y ) (c_x, c_y) (cx,cy),形式为:
    K = [ f x 0 c x 0 f y c y 0 0 1 ] K = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} K= fx000fy0cxcy1
  • [ R ∣ t ] [R \ | \ t] [R  t] 是外参矩阵( 3 × 4 3 \times 4 3×4),由旋转矩阵 R R R 3 × 3 3 \times 3 3×3)和平移向量 t t t 3 × 1 3 \times 1 3×1)组成,表示世界坐标系到相机坐标系的变换。

关键性质

  1. 投影矩阵前三列 P [ : , 1 : 3 ] P_{[:,1:3]} P[:,1:3] 对应 K ⋅ R K \cdot R KR,第四列 P [ : , 4 ] P_{[:,4]} P[:,4] 对应 K ⋅ t K \cdot t Kt
  2. 任何非奇异的前三列矩阵均可通过分解唯一确定 K K K R R R

二、分解步骤与数学方法
1. 分离内参矩阵 K K K 和外参旋转矩阵 R R R

对投影矩阵的前三列进行 RQ分解(或等效的 QR分解):
K ⋅ R = P [ : , 1 : 3 ] ⇒ RQ分解 ⇒ K , R K \cdot R = P_{[:,1:3]} \quad \Rightarrow \quad \text{RQ分解} \quad \Rightarrow \quad K, R KR=P[:,1:3]RQ分解K,R

  • RQ分解:将矩阵分解为一个上三角矩阵(对应内参 K K K)和一个正交矩阵(对应旋转 R R R)。由于 K K K 是上三角矩阵, R R R 是正交矩阵(满足 R T R = I R^T R = I RTR=I),此分解是唯一的。
  • 验证分解结果
    • 检查 K K K 的最后一行为 [ 0 , 0 , 1 ] [0, 0, 1] [0,0,1],否则需对矩阵进行归一化。
    • 若分解后 R R R 的行列式不为 1 1 1(即非旋转矩阵),需调整符号以保证其为合法旋转矩阵。
2. 求解平移向量 t t t

从投影矩阵第四列提取 K ⋅ t K \cdot t Kt,并通过逆运算得到平移向量:
t = K − 1 ⋅ P [ : , 4 ] t = K^{-1} \cdot P_{[:,4]} t=K1P[:,4]
示例:若 K = [ f x 0 c x 0 f y c y 0 0 1 ] K = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} K= fx000fy0cxcy1 ,则 K − 1 = [ 1 / f x 0 − c x / f x 0 1 / f y − c y / f y 0 0 1 ] K^{-1} = \begin{bmatrix} 1/f_x & 0 & -c_x/f_x \\ 0 & 1/f_y & -c_y/f_y \\ 0 & 0 & 1 \end{bmatrix} K1= 1/fx0001/fy0cx/fxcy/fy1

3. 分解的唯一性与约束条件
  • 尺度等价性:投影矩阵 P P P 的尺度不确定性(即 P P P λ P \lambda P λP 等价)需通过附加约束(如焦距的物理单位)确定。
  • 非奇异条件:分解要求 P P P 的前三列矩阵非奇异(即 det ⁡ ( P [ : , 1 : 3 ] ) ≠ 0 \det(P_{[:,1:3]}) \neq 0 det(P[:,1:3])=0)。

2分解单应矩阵

2.1世界坐标到像素坐标

当世界坐标为平面时,投影矩阵此时为特殊的单应矩阵,利用张正友标定法原理可以求解相机位姿。

2.2像素坐标到像素坐标

当单应矩阵描述两张照片的射影关系时,有数值法和解析法:
《Motion and structure from motion in a piecewise planar environment》
《3d reconstruction based on homography mapping》
《Deeper understanding of the homography decomposition for vision based control》


3分解本质矩阵

3.1 基本矩阵分解得到相机位姿的完整解析

在双目视觉或多视图几何中,基本矩阵(Fundamental Matrix)描述了不同视角间图像点对应的对极几何约束关系。分解基本矩阵以恢复相机位姿(旋转矩阵 R R R和平移向量 t t t)是三维重建与SLAM系统的核心步骤。以下结合数学推导、分解方法及工程实践,详细阐述其实现过程。


一、基本矩阵与本质矩阵的关系

基本矩阵 F F F和本质矩阵 E E E是理解对极几何的关键:

  1. 基本矩阵 F F F
    定义两视图间的对极约束关系,满足:
    x ′ T F x = 0 \mathbf{x}'^T F \mathbf{x} = 0 xTFx=0
    其中 x \mathbf{x} x x ′ \mathbf{x}' x为归一化平面坐标点。

  2. 本质矩阵 E E E
    当相机内参 K K K已知时, E E E F F F的关系为:
    E = K T F K E = K^T F K E=KTFK
    E E E可分解为旋转矩阵 R R R和平移向量 t t t的组合:
    E = [ t ] × R E = [t]_\times R E=[t]×R
    其中 [ t ] × [t]_\times [t]×为平移向量 t t t的斜对称矩阵。


二、分解本质矩阵的数学步骤
1. 奇异值分解(SVD)

对本质矩阵 E E E进行SVD分解:
E = U Σ V T E = U \Sigma V^T E=UΣVT
其中 Σ = diag ( σ 1 , σ 2 , 0 ) \Sigma = \text{diag}(\sigma_1, \sigma_2, 0) Σ=diag(σ1,σ2,0) σ 1 ≈ σ 2 \sigma_1 \approx \sigma_2 σ1σ2。根据Hartley的归一化方法, Σ \Sigma Σ可替换为 diag ( 1 , 1 , 0 ) \text{diag}(1,1,0) diag(1,1,0)以消除尺度影响。

2. 构造候选解

分解后,旋转矩阵 R R R和平移向量 t t t的可能组合为:
R = U W V T 或 R = U W T V T R = U W V^T \quad \text{或} \quad R = U W^T V^T R=UWVTR=UWTVT
t = U ⋅ 3 或 t = − U ⋅ 3 t = U_{\cdot 3} \quad \text{或} \quad t = -U_{\cdot 3} t=U3t=U3
其中:
W = [ 0 − 1 0 1 0 0 0 0 1 ] W = \begin{bmatrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{bmatrix} W= 010100001
这会产生四组候选解 ( R 1 , t 1 ) , ( R 1 , − t 1 ) , ( R 2 , t 1 ) , ( R 2 , − t 1 ) (R_1, t_1), (R_1, -t_1), (R_2, t_1), (R_2, -t_1) (R1,t1),(R1,t1),(R2,t1),(R2,t1)

3. 解的唯一性筛选

通过正深度约束筛选正确解:

  1. 对匹配点对 x ↔ x ′ \mathbf{x} \leftrightarrow \mathbf{x}' xx,计算三角化后的3D点 P P P在相机坐标系下的深度 Z Z Z
  2. 若所有点的深度 Z Z Z均为正,则该解为物理可行解。
  3. 若存在多组可行解,需结合多视图几何或先验信息进一步判断。

4PnP方法

通过已知的3d点和对应的2d点,直接求解相机位姿,主要有直接线性变换,p3p,EPnP,BA等。
参考:
MVG
slam14讲
1
2

相关文章:

多视图几何--恢复相机位姿/内参的几种方法

恢复相机位姿的几种方法 1分解投影矩阵 1.1投影矩阵分解为相机内外参矩阵的完整解析 投影矩阵(Projection Matrix)是计算机视觉中将三维世界点映射到二维像素坐标的核心工具,其本质是相机内参矩阵(Intrinsic Matrix&#xff09…...

[数据结构]堆详解

目录 一、堆的概念及结构 二、堆的实现 1.堆的定义 2堆的初始化 3堆的插入 ​编辑 4.堆的删除 5堆的其他操作 6代码合集 三、堆的应用 (一)堆排序(重点) (二)TOP-K问题 一、堆的概念及结构 堆的…...

领域驱动设计(DDD)与MVC架构:理念对比与架构选择

领域驱动设计(DDD)与MVC架构:理念对比与架构选择 一、架构之争的本质:业务复杂度驱动技术演进 在软件开发领域,没有银弹式的完美架构,只有适合当前业务场景的合理选择。MVC与DDD的区别本质上是业务复杂度与…...

牛客周赛:84:B:JAVA

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scanner new Scanner(S…...

【理想解法学习笔记】

目录 理想解法原理简介算法步骤属性值规范化方法代码示例 理想解法 原理简介 TOPSIS(Technique for Order Preference by Simi larity to IdealSolution)法是一种逼近理想解的排序方法。其基本的处理思路是:首先建立初始化决策矩阵,而后基于规范化后的初…...

CI/CD—Jenkins配置一次完整的jar自动化发布流程

背景: 实现设想: 要创建自动化发布,需要准备一台测试服务器提前安装好java运行所需的环境,JDK版本最好和Windows开发机器上的版本一致,在Jenkins上配置将构建好的jar上传到测试服务器上,测试服务器自动启动…...

Magento2根据图片文件包导入产品图片

图片包给的图片文件是子产品的图片&#xff0c;如下图&#xff1a;A104255是主产品的sku <?php/*** 根据图片包导入产品图片&#xff0c;包含子产品和主产品* 子产品是作为主图&#xff0c;主产品是作为附加图片*/use Magento\Framework\App\Bootstrap;include(../app/boot…...

从零开始的python学习(五)P71+P72+P73+P74

本文章记录观看B站python教程学习笔记和实践感悟&#xff0c;视频链接&#xff1a;【花了2万多买的Python教程全套&#xff0c;现在分享给大家&#xff0c;入门到精通(Python全栈开发教程)】 https://www.bilibili.com/video/BV1wD4y1o7AS/?p6&share_sourcecopy_web&v…...

OpenHarmony5.0分布式系统源码实现分析—软总线

一、引言 OpenHarmony 作为一款面向万物互联的操作系统&#xff0c;其分布式软总线&#xff08;Distributed SoftBus&#xff09;是实现设备间高效通信和协同的核心技术之一。分布式软总线通过构建一个虚拟的总线网络&#xff0c;使得不同设备能够无缝连接、通信和协同工作。本…...

基于SpringBoot实现旅游酒店平台功能六

一、前言介绍&#xff1a; 1.1 项目摘要 随着社会的快速发展和人民生活水平的不断提高&#xff0c;旅游已经成为人们休闲娱乐的重要方式之一。人们越来越注重生活的品质和精神文化的追求&#xff0c;旅游需求呈现出爆发式增长。这种增长不仅体现在旅游人数的增加上&#xff0…...

代码随想录算法训练营第六十一天 | 108. 冗余连接 109. 冗余连接II

108. 冗余连接 题目链接&#xff1a;KamaCoder 文档讲解&#xff1a;代码随想录 状态&#xff1a;AC Java代码&#xff1a; import java.util.*;class Main {public static int[] father;public static void main(String[] args) {Scanner scan new Scanner(System.in);int n…...

RoboVQA:机器人多模态长范围推理

23 年 11 月来自 Google Deepmind 的论文“RoboVQA: Multimodal Long-Horizon Reasoning for Robotics”。 本文提出一种可扩展、自下而上且本质多样化的数据收集方案&#xff0c;该方案可用于长期和中期的高级推理&#xff0c;与传统的狭窄自上而下的逐步收集相比&#xff0c…...

TCP/IP原理详细解析

前言 TCP/IP是一种面向连接&#xff0c;可靠的传输&#xff0c;传输数据大小无限制的。通常情况下&#xff0c;系统与系统之间的http连接需要三次握手和四次挥手&#xff0c;这个执行过程会产生等待时间。这方面在日常开发时需要注意一下。 TCP/IP 是互联网的核心协议族&…...

Microsof Visual Studio Code 安装教程(中文设置)

VS Code 是一个免费的代码编辑器&#xff0c;可在 macOS、Linux 和 Windows作系统上运行。启动和运行 VS Code 既快速又简单。VS Code&#xff08;全称 Visual Studio Code&#xff09;是一款由Microsoft 推出的免费、开源、跨平台的代码编辑器&#xff0c;拥有强大的功能和灵活…...

python爬虫:Android自动化工具Auto.js的详细使用

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. Auto.js 简介2. 安装与配置2.1 安装 Auto.js2.2 安装 Python 环境2.3 安装 ADB 工具3. Python 与 Auto.js 结合3.1 通过 ADB 执行 Auto.js 脚本3.2 通过 Python 控制 Auto.js3.3 通过 Python 与 Auto.js 交互4. 常用…...

Unity DOTS从入门到精通之 自定义Authoring类

文章目录 前言安装 DOTS 包什么是Authoring1. 实体组件2. Authoring类 前言 DOTS&#xff08;面向数据的技术堆栈&#xff09;是一套由 Unity 提供支持的技术&#xff0c;用于提供高性能游戏开发解决方案&#xff0c;特别适合需要处理大量数据的游戏&#xff0c;例如大型开放世…...

linux 软件安装(上)

一、基础环境准备 1.1、安装VM 1.2、在VM上导入linux iso镜像&#xff0c;装好linux系统 华为centos镜像下载地址 https://mirrors.huaweicloud.com/centos/ https://mirrors.huaweicloud.com/centos/7.9.2009/isos/x86_64/ 网易centos镜像下载地址 htt…...

php虚拟站点提示No input file specified时的问题及权限处理方法

访问站点&#xff0c;提示如下 No input file specified. 可能是文件权限有问题&#xff0c;也可能是“.user.ini”文件路径没有配置对&#xff0c;最简单的办法就是直接将它删除掉&#xff0c;还有就是将它设置正确 #配置成自己服务器上正确的路径 open_basedir/mnt/qiy/te…...

【江协科技STM32】ADC数模转换器-学习笔记

ADC简介 ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁&#xff0c;ADC是一种将连续的模拟信号转换为离散的数字信号的设备或模块12位逐次逼近型…...

QT系列教程(20) Qt 项目视图便捷类

视频连接 https://www.bilibili.com/video/BV1XY41127t3/?vd_source8be9e83424c2ed2c9b2a3ed1d01385e9 Qt项目视图便捷类 Qt项目视图提供了一些便捷类&#xff0c;包括QListWidget, QTableWidget&#xff0c; QTreeWidget等。我们分别介绍这几个便捷类。 我们先创建一个Qt …...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...