当前位置: 首页 > 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中该函数的注释…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

测试markdown--肇兴

day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦&#xff0…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...