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

多视图几何--结构恢复--三角测量

三角测量

1. 核心公式推导

假设两个相机的投影矩阵为 P P P P ′ P' P,对应的匹配图像点(同名点)为 ( u , v ) (u, v) (u,v) ( u ′ , v ′ ) (u', v') (u,v),目标是求解三维点 X = [ X x , X y , X z , 1 ] T X = [X_x, X_y, X_z, 1]^T X=[Xx,Xy,Xz,1]T(齐次坐标)。

投影方程

每个相机的投影方程可以表示为:
{ u = P 00 X x + P 01 X y + P 02 X z + P 03 P 20 X x + P 21 X y + P 22 X z + P 23 v = P 10 X x + P 11 X y + P 12 X z + P 13 P 20 X x + P 21 X y + P 22 X z + P 23 u ′ = P 00 ′ X x + P 01 ′ X y + P 02 ′ X z + P 03 ′ P 20 ′ X x + P 21 ′ X y + P 22 ′ X z + P 23 ′ v ′ = P 10 ′ X x + P 11 ′ X y + P 12 ′ X z + P 13 ′ P 20 ′ X x + P 21 ′ X y + P 22 ′ X z + P 23 ′ \begin{cases} u = \frac{P_{00}X_x + P_{01}X_y + P_{02}X_z + P_{03}}{P_{20}X_x + P_{21}X_y + P_{22}X_z + P_{23}} \\ v = \frac{P_{10}X_x + P_{11}X_y + P_{12}X_z + P_{13}}{P_{20}X_x + P_{21}X_y + P_{22}X_z + P_{23}} \\ u' = \frac{P'_{00}X_x + P'_{01}X_y + P'_{02}X_z + P'_{03}}{P'_{20}X_x + P'_{21}X_y + P'_{22}X_z + P'_{23}} \\ v' = \frac{P'_{10}X_x + P'_{11}X_y + P'_{12}X_z + P'_{13}}{P'_{20}X_x + P'_{21}X_y + P'_{22}X_z + P'_{23}} \\ \end{cases} u=P20Xx+P21Xy+P22Xz+P23P00Xx+P01Xy+P02Xz+P03v=P20Xx+P21Xy+P22Xz+P23P10Xx+P11Xy+P12Xz+P13u=P20Xx+P21Xy+P22Xz+P23P00Xx+P01Xy+P02Xz+P03v=P20Xx+P21Xy+P22Xz+P23P10Xx+P11Xy+P12Xz+P13

消去分母

将分母移到等式左边,得到四个线性方程:
{ u ( P 20 X x + P 21 X y + P 22 X z + P 23 ) = P 00 X x + P 01 X y + P 02 X z + P 03 v ( P 20 X x + P 21 X y + P 22 X z + P 23 ) = P 10 X x + P 11 X y + P 12 X z + P 13 u ′ ( P 20 ′ X x + P 21 ′ X y + P 22 ′ X z + P 23 ′ ) = P 00 ′ X x + P 01 ′ X y + P 02 ′ X z + P 03 ′ v ′ ( P 20 ′ X x + P 21 ′ X y + P 22 ′ X z + P 23 ′ ) = P 10 ′ X x + P 11 ′ X y + P 12 ′ X z + P 13 ′ \begin{cases} u (P_{20}X_x + P_{21}X_y + P_{22}X_z + P_{23}) = P_{00}X_x + P_{01}X_y + P_{02}X_z + P_{03} \\ v (P_{20}X_x + P_{21}X_y + P_{22}X_z + P_{23}) = P_{10}X_x + P_{11}X_y + P_{12}X_z + P_{13} \\ u' (P'_{20}X_x + P'_{21}X_y + P'_{22}X_z + P'_{23}) = P'_{00}X_x + P'_{01}X_y + P'_{02}X_z + P'_{03} \\ v' (P'_{20}X_x + P'_{21}X_y + P'_{22}X_z + P'_{23}) = P'_{10}X_x + P'_{11}X_y + P'_{12}X_z + P'_{13} \\ \end{cases} u(P20Xx+P21Xy+P22Xz+P23)=P00Xx+P01Xy+P02Xz+P03v(P20Xx+P21Xy+P22Xz+P23)=P10Xx+P11Xy+P12Xz+P13u(P20Xx+P21Xy+P22Xz+P23)=P00Xx+P01Xy+P02Xz+P03v(P20Xx+P21Xy+P22Xz+P23)=P10Xx+P11Xy+P12Xz+P13

矩阵形式

将上述方程整理为齐次方程组 A ⋅ X = 0 A \cdot X = 0 AX=0,其中系数矩阵 A A A 的每一行对应一个方程:
A = [ u P 2 − P 0 v P 2 − P 1 u ′ P 2 ′ − P 0 ′ v ′ P 2 ′ − P 1 ′ ] A = \begin{bmatrix} u P_{2} - P_{0} \\ v P_{2} - P_{1} \\ u' P'_{2} - P'_{0} \\ v' P'_{2} - P'_{1} \\ \end{bmatrix} A= uP2P0vP2P1uP2P0vP2P1

这里 P i P_{i} Pi 表示投影矩阵的第 i i i 行(如 P 0 = [ P 00 , P 01 , P 02 , P 03 ] P_{0} = [P_{00}, P_{01}, P_{02}, P_{03}] P0=[P00,P01,P02,P03]),进而通过SVD求解 X X X的齐次坐标。


2. 代码实现步骤

以下是基于公式的手动实现(Python + NumPy):

步骤1:构造系数矩阵 $ A $
def triangulate_point(P1, P2, pt1, pt2):"""P1, P2: 3x4 投影矩阵pt1, pt2: 匹配的二维点 (u, v)"""u1, v1 = pt1u2, v2 = pt2# 构造矩阵A的每一行row1 = u1 * P1[2, :] - P1[0, :]  # u * P1[2] - P1[0]row2 = v1 * P1[2, :] - P1[1, :]  # v * P1[2] - P1[1]row3 = u2 * P2[2, :] - P2[0, :]  # u' * P2[2] - P2[0]row4 = v2 * P2[2, :] - P2[1, :]  # v' * P2[2] - P2[1]A = np.vstack([row1, row2, row3, row4])return A
步骤2:SVD分解求解最小二乘解
def solve_svd(A):# 奇异值分解U, S, Vt = np.linalg.svd(A)# V的最后一列对应最小奇异值的解X = Vt[-1, :]# 归一化齐次坐标X = X / X[3]return X[:3]  # 返回三维坐标 (X, Y, Z)

相关文章:

多视图几何--结构恢复--三角测量

三角测量 1. 核心公式推导 假设两个相机的投影矩阵为 P P P 和 P ′ P P′,对应的匹配图像点(同名点)为 ( u , v ) (u, v) (u,v) 和 ( u ′ , v ′ ) (u, v) (u′,v′),目标是求解三维点 X [ X x , X y , X z , 1 ] T X [X_x, X_y, X_z, 1]^T X…...

【Linux三剑客】awk命令使用

AWK 编程语言中的变量 AWK 提供了许多可在模式和操作中使用的内置变量。最常用的变量是 - NR - 表示当前记录(行)号 NF - 表示输入记录中的字段总数。 $0 - 整个当前记录。 $1, $2, $3, … - 当前记录中的第一个、第二个、第三个…字段。 查找passwd中…...

Python CATIA二次开发实战:CATIA产品号批量同步文件名工具开发

引言 在汽车/航空制造领域,CATIA文件的结构化管理直接影响着PLM系统数据一致性。笔者近期开发的增强型产品号同步工具,成功解决了工程实践中文件名与产品名称不同步的痛点问题。本文将从技术实现、功能亮点、应用场景三个维度进行深度解析。 一、技术方…...

我的两个医学数据分析技术思路

我的两个医学数据分析技术思路 从临床上获得的或者公共数据库数据这种属于观察性研究,是对临床诊疗过程中自然产生的数据进行分析而获得疾病发生发展的规律等研究成果。再细分,可以分为独立危险因素鉴定和预测模型构建两种。 独立危险因素鉴定是一直以…...

操作系统之进程状态、优先级和切换与调度

文章目录 1. 进程状态1.1 课本名词提炼1.2 运行&阻塞&挂起1.2.1 运行1.2.2 阻塞1.2.3 挂起 1.3 理解内核链表1.4 Linux中的内核解释1.5 进程状态的查看1.6 Z(zombie)——僵尸进程1.6.1 创建僵尸进程1.6.2 僵尸进程的危害 1.7 孤儿进程 2. 进程优先级2.1 基本概念2.2 查…...

[免费]微信小程序(图书馆)自习室座位预约管理系统(SpringBoot后端+Vue管理端)(高级版)【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的微信小程序(图书馆)自习室座位预约管理系统(SpringBoot后端Vue管理端)(高级版),分享下哈。 项目视频演示 【免费】微信小程序(图书馆)自习室座位预约管理系统(SpringBoot后端Vue管理端)(高级版…...

你使用过哪些 Java 并发工具类?

你的回答(口语化,面试场景) 面试官:你使用过哪些 Java 并发工具类? 你: 好的,我结合项目经验来说说常用的并发工具类: CountDownLatch 作用:等所有线程就绪后再触发任务…...

模板方法模式的C++实现示例

核心思想 模板方法设计模式是一种行为设计模式,它定义了一个算法的框架,并将某些步骤的具体实现延迟到子类中。通过这种方式,模板方法模式允许子类在不改变算法结构的情况下重新定义算法的某些步骤。 模板方法模式的核心在于: ​…...

国产编辑器EverEdit - 脚本(解锁文本编辑的无限可能)

1 脚本 1.1 应用场景 脚本是一种功能扩展代码,用于提供一些编辑器通用功能提供不了的功能,帮助用户在特定工作场景下提高工作效率,几乎所有主流的编辑器、IDE都支持脚本。   EverEdit的脚本支持js(语法与javascript类似)、VBScript两种编程…...

越早越好!8 个反直觉的金钱真相|金钱心理学

很多人都追求财富自由,但成功的人少之又少。 这可能是因为,人们往往忽略了一些金钱的真相和常识。 01 金钱常识 & 真相 为了构建健康的金钱观,我读了一本有点反直觉,有点像鸡汤,但都是财富真相的书。 来自 Morg…...

linux docker相关指令

1、镜像操作 0)、搜索:docker search 镜像名称 1)、拉取:docker pull 2)、推送:docker push 3)、查看:docker images 4)、查看所有镜像ID:d…...

实时采集到的语音进行语音识别

要在.NET Framework 4.8中使用C#实现离线实时语音识别,可以使用开源库Vosk(支持离线ASR)配合音频处理库NAudio。 步骤 1:安装依赖库 1.1. 安装NuGet包: - Install-Package NAudio(处理音频输入&#xff09…...

Ollama 本地部署 DeepSeek R1 及 Python 运行 open-webui 界面(windows)

DeepSeek R1 ollama open-webui 本地部署(windows) DeepSeek-R1本地部署配置要求 Github地址:https://github.com/deepseek-ai/DeepSeek-R1?tabreadme-ov-file 模型规模最低 GPU 显存推荐 GPU 型号纯 CPU 内存需求适用场景1.5B4GBRTX 3…...

牛客周赛:84:C:JAVA

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 \hspace{15pt}本题为《D.小红的陡峭值(三)》的简单版本,两题的唯一区别在于本题的数据范围更小。 \hspace{15pt}小红定义一个字符串的陡峭值为&a…...

5. 前后端实现文件上传与解析

1. 说明 在实际开发中,比较常见的一个功能是需要在前端页面中选择系统中的某个文件上传到服务器中进行解析,解析后的文件内容可以用来在服务器中当作参数,或者传递给其它组件使用,或者需要存储到数据库中。所以本文就提供一种方式…...

SpringBoot 接入 豆包 火山方舟大模型

火山方舟控制台 开通模型推理、知识库 应用入口; 文档中心 各类接口说明及SDK 获取; 向量数据库VikingDB 文档 下翻找到有java操作案例; 实现目标功能效果: 通过SDK调用 豆包大模型,在代码内实现问答的效果&#xf…...

IDEA接入阿里云百炼中免费的通义千问[2025版]

安装deepseek 上一篇文章IDEA安装deepseek最新教程2025中说明了怎么用idea安装codeGPT插件,并接入DeepSeek,无奈接入的官方api已经不能使用了,所以我们尝试从其他地方接入 阿里云百炼https://bailian.console.aliyun.com/ 阿里云百炼‌是阿…...

下载kali linux遇到的一些问题

kali官网:kali官网跳转 问题一:未启动VM Service VMware Workstation 未能启动 VMware Authorization Service。您可以尝试手动启动VMware Authorization Service。如果此问题仍然存在,请联系VMware 支持部门。 解决办法: 步骤1…...

常见排序算法深度评测:从原理到10万级数据实战

常见排序算法深度评测:从原理到10万级数据实战 摘要 本文系统解析冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序和基数排序8种经典算法,通过C语言实现10万随机数排序并统计耗时。测试显示:快速排序综合性能最优&…...

Scaled_dot_product_attention(SDPA)使用详解

在学习huggingFace的Transformer库时,我们不可避免会遇到scaled_dot_product_attention(SDPA)这个函数,它被用来加速大模型的Attention计算,本文就详细介绍一下它的使用方法,核心内容主要参考了torch.nn.functional中该函数的注释…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

零基础设计模式——行为型模式 - 责任链模式

第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合

无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...

麒麟系统使用-进行.NET开发

文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的,如果需要进行.NET开发,则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET,所以要进…...

41道Django高频题整理(附答案背诵版)

解释一下 Django 和 Tornado 的关系? Django和Tornado都是Python的web框架,但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架,鼓励快速开发和干净、实用的设计。它遵循MVC设计,并强调代码复用。Django有…...

大模型真的像人一样“思考”和“理解”吗?​

Yann LeCun 新研究的核心探讨:大语言模型(LLM)的“理解”和“思考”方式与人类认知的根本差异。 核心问题:大模型真的像人一样“思考”和“理解”吗? 人类的思考方式: 你的大脑是个超级整理师。面对海量信…...

【Redis】Redis从入门到实战:全面指南

Redis从入门到实战:全面指南 一、Redis简介 Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储系统,它可以用作数据库、缓存和消息代理。由Salvatore Sanfilippo于2009年开发,因其高性能、丰富的数据结构和广泛的语言支持而广受欢迎。 Redis核心特点:…...