PnP(Perspective-n-Point)算法 | 用于求解已知n个3D点及其对应2D投影点的相机位姿
什么是PnP算法?
- PnP 全称是 Perspective-n-Point,中文叫“n点透视问题”。
- 它的目标是:
已知一些空间中已知3D点的位置(世界坐标)和它们对应的2D图像像素坐标,求解摄像机的姿态(位置和平移)和朝向(旋转)。
简单来说,就是通过3D点和它们在照片上的投影点,算出相机“站在哪儿”和“看向哪儿”。
PnP解决的问题
你有一堆现实世界的点(比如3D模型上的标志点),也知道这些点在照片里的像素位置,PnP就是帮你找出“相机相对于这些点的位置和角度”。
PnP算法的原理(简单版)
-
已知条件:
- n n n 个已知3D点 P i = ( X i , Y i , Z i ) P_i = (X_i, Y_i, Z_i) Pi=(Xi,Yi,Zi),在世界坐标系里。
- 它们对应的2D像素点 p i = ( u i , v i ) p_i = (u_i, v_i) pi=(ui,vi),在图像中。
-
目标:
- 找到相机的旋转矩阵 R R R 和平移向量 t t t,使得所有3D点经过变换后投影到图像上的位置,尽可能接近对应的2D点。
-
数学关系:
s [ u i v i 1 ] = K × ( R × P i + t ) s \begin{bmatrix} u_i \\ v_i \\ 1 \end{bmatrix} = K \times \big( R \times P_i + t \big) s uivi1 =K×(R×Pi+t)
其中:
- K K K 是相机内参矩阵,已知。
- R , t R, t R,t 是未知(我们要解的)。
- s s s 是尺度因子(用于齐次坐标)。
-
求解过程:
- 利用多组点的对应关系,建立方程组。
- 通过最小化投影误差(图像点和投影点的距离),用优化算法求出最佳的 R R R 和 t t t。
你可以这样理解:
- PnP就像“反向投影”:你知道点在现实和照片的位置,求相机的位置和朝向。
额外说明:
- 如果点的数量较少(最少4个点),算法能工作,但更多点通常能得到更稳定准确的结果。
- 经典的PnP算法有很多变体,比如EPnP、UPnP、RPnP等,都旨在更快或更鲁棒地求解。
值得注意的是PnP的前提:对应关系必须先确定
-
**PnP算法本身不负责找到哪些3D点对应哪些2D点,**它的输入是:
- 一组3D点(已知位置)
- 它们在图像中的对应2D点
-
所以,在用PnP之前,必须先解决“匹配”问题:
怎样找到图像中哪个像素点对应哪个3D世界点?
对应关系的获得途径举例:
-
人工标定/标记:
在物体或场景上贴标记点,知道标记点的3D坐标,手动或者半自动找到图像中的对应点。 -
特征匹配:
利用特征点检测(如SIFT、ORB)在图像中提取关键点,并用描述子匹配它们与3D点(如用激光扫描得到的点云中提取特征点)。 -
结构光或投影仪:
通过主动投影图案产生已知对应关系。 -
深度相机(RGB-D)或激光雷达数据:
直接获得3D点和2D图像对齐。
没有对应关系,PnP算法就无从下手
所以在做定位、姿态估计、SLAM等任务时,建立稳定准确的“3D点 ↔ 2D点”对应关系是关键的第一步。
相关文章:

PnP(Perspective-n-Point)算法 | 用于求解已知n个3D点及其对应2D投影点的相机位姿
什么是PnP算法? PnP 全称是 Perspective-n-Point,中文叫“n点透视问题”。它的目标是: 已知一些空间中已知3D点的位置(世界坐标)和它们对应的2D图像像素坐标,求解摄像机的姿态(位置和平移&…...
LeetCode 热题 100 208. 实现 Trie (前缀树)
LeetCode 热题 100 | 208. 实现 Trie (前缀树) 大家好!今天我们来解决一道经典的算法题——实现 Trie (前缀树)。Trie(发音类似 “try”)是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构在自动补全和拼…...
python爬虫:RoboBrowser 的详细使用
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、RoboBrowser概述1.1 RoboBrowser 介绍1.2 安装 RoboBrowser1.3 与类似工具比较二、基本用法2.1 创建浏览器对象并访问网页2.2 查找元素2.3 填写和提交表单三、高级功能3.1 处理文件上传3.2 处理JavaScript重定向3.3…...

在日常管理服务器中如何防止SQL注入与XSS攻击?
在日常管理服务器时,防止SQL注入(Structured Query Language Injection)和XSS(Cross-Site Scripting)攻击是至关重要的,这些攻击可能会导致数据泄露、系统崩溃和信息泄露。以下是一份技术文章,介…...

Wkhtmltopdf使用
Wkhtmltopdf使用 1.windows本地使用2.golangwindows环境使用3.golangdocker容器中使用 1.windows本地使用 官网地址 https://wkhtmltopdf.org/,直接去里面下载自己想要的版本,这里以windows版本为例2.golangwindows环境使用 1.安装扩展go get -u githu…...

ArcGIS Pro 创建渔网格网过大,只有几个格网的解决方案
之前用ArcGIS Pro创建渔网的时候,发现创建出来格网过大,只有几个格网。 后来查阅资料,发现是坐标不对,导致设置格网大小时单位为度,而不是米,因此需要进行坐标系转换,网上有很多资料讲了ArcGIS …...

重学计算机网络之以太网
一:历史发展进程 DIX EtherNet V2 战胜IEEE802.3成为主流版本。总线型交换机拓扑机构代替集线器星型拓扑机构 1990年IEEE制定出星形以太网10BASE-T的标准**802.3i**。“10”代表10 Mbit/s 的数据率,BASE表示连接线上的信号是基带信号,T代表…...

《深度解构现代云原生微服务架构的七大支柱》
☁️《深度解构现代云原生微服务架构的七大支柱》 一线架构师实战总结,系统性拆解现代微服务架构中最核心的 7 大支柱模块,涵盖通信协议、容器编排、服务网格、弹性伸缩、安全治理、可观测性、CI/CD 等。文内附架构图、实操路径与真实案例,适…...

使用SCSS实现随机大小的方块在页面滚动
目录 一、scss中的插值语法 二、方块在界面上滚动的动画 一、scss中的插值语法 插值语法 #{} 是一种动态注入变量或表达式到选择器、属性名、属性值等位置的机制 .类名:nth-child(n) 表示需同时满足为父元素的第n个元素且类名为给定条件 效果图: <div class…...

AI 眼镜新纪元:贴片式TF卡与 SOC 芯片的黄金组合破局智能穿戴
目录 一、SD NAND:智能眼镜的“记忆中枢”突破空间限制的存储革命性能与可靠性的双重保障 二、SOC芯片:AI眼镜的“智慧大脑”从性能到能效的全面跃升多模态交互的底层支撑 三、SD NANDSOC:11>2的协同效应数据流水线的高效协同成本…...

论文阅读(六)Open Set Video HOI detection from Action-centric Chain-of-Look Prompting
论文来源:ICCV(2023) 项目地址:https://github.com/southnx/ACoLP 1.研究背景与问题 开放集场景下的泛化性:传统 HOI 检测假设训练集包含所有测试类别,但现实中存在大量未见过的 HOI 类别(如…...

算法学习--持续更新
算法 2025年5月24日 完成:快速排序、快速排序基数优化、尾递归优化 快排 public class QuickSort {public void sort(int[] nums, int left, int right) {if(left>right){return;}int partiton quickSort(nums,left,right);sort(nums,left,partiton-1);sort(nu…...

Postman 发送 SOAP 请求步骤 归档
0.来源 https://apifox.com/apiskills/sending-soap-requests-with-postman/?utm_sourceopr&utm_mediuma2bobzhang&utm_contentpostman 再加上自己一点实践经验 1. 创建一个新的POST请求 postman 创建一个post请求, 请求url 怎么来的可以看第三步 2. post请求设…...

Python Day39 学习(复习日志Day4)
复习Day4日志内容 浙大疏锦行 补充: 关于“类”和“类的实例”的通俗易懂的例子 补充:如何判断是用“众数”还是“中位数”填补空缺值? 今日复习了日志Day4的内容,感觉还是得在纸上写一写印象更深刻,接下来几日都采取“纸质化复…...

[Python] Python自动化:PyAutoGUI的基本操作
初次学习,如有错误还请指正 目录 PyAutoGUI介绍 PyAutoGUI安装 鼠标相关操作 鼠标移动 鼠标偏移 获取屏幕分辨率 获取鼠标位置 案例:实时获取鼠标位置 鼠标点击 左键单击 点击次数 多次有时间间隔的点击 右键/中键点击 移动时间 总结 鼠…...
课程介绍:《ReactNative基础与实战指南2025》
学习如何使用 ReactJS 构建适用于 iOS 和 Android 的 React Native 移动应用,无需 ReactJS 经验。无需掌握 Swift、Objective-C 或 Java/Android,也能开发跨平台(iOS 和 Android)移动应用。 全面掌握 React Native 的核心与进阶内…...
“候选对话链”(Candidate Dialogue Chain)概念
目录 一、定义与形式 二、生成过程详解 1. 语言模型生成(LLM-Based Generation) 2. 知识图谱支持(KG-Augmented Generation) 3. 策略调控(Policy-Driven Planning) 三、候选对话链的属性 四、候选对…...

应急响应靶机-web2-知攻善防实验室
题目: 前景需要:小李在某单位驻场值守,深夜12点,甲方已经回家了,小李刚偷偷摸鱼后,发现安全设备有告警,于是立刻停掉了机器开始排查。 这是他的服务器系统,请你找出以下内容&#…...

comfyui利用 SkyReels-V2直接生成长视频本地部署问题总结 1
在通过桌面版comfyUI 安装ComfyUI-WanVideoWrapper 进行SkyReels-V2 生成长视频的过程中,出现了,很多错误。 总结一下,让大家少走点弯路 下面是基于搜索结果的 ComfyUI 本地部署 SkyReels-V2 实现长视频生成的完整指南,涵盖环境配…...
UV 包管理工具:替代 pip 的现代化解决方案
安装 方法一:使用安装脚本 # macOS 和 Linux curl -LsSf https://astral.sh/uv/install.sh | sh# Windows PowerShell powershell -c "irm https://astral.sh/uv/install.ps1 | iex" 方法二:使用包管理器 # macOS (Homebrew) brew install uv#…...
css3 新增属性/滤镜效果/裁剪元素/图片适应盒子/定义和使用变量/恢复默认initial
从 CSS3 发布至今,CSS 标准引入了大量新特性,极大地丰富了前端开发的能力。以下是 CSS3 之后的重要新增属性、模块与特性总结,涵盖布局、动画、交互、视觉、选择器、单位等多个领域。 🎨 视觉与效果增强 属性/功能作用示例filte…...

YOLOv8 实战指南:如何实现视频区域内的目标统计与计数
文章目录 YOLOv8改进 | 进阶实战篇:利用YOLOv8进行视频划定区域目标统计计数1. 引言2. YOLOv8基础回顾2.1 YOLOv8架构概述2.2 YOLOv8的安装与基本使用 3. 视频划定区域目标统计的实现3.1 核心思路3.2 完整实现代码 4. 代码深度解析4.1 关键组件分析4.2 性能优化技巧…...

matlab实现VMD去噪、SVD去噪,源代码详解
为了更好的利用MATLAB自带的vmd、svd函数,本期作者将详细讲解一下MATLAB自带的这两个分解函数如何使用,以及如何画漂亮的模态分解图。 VMD函数用法详解 首先给出官方vmd函数的调用格式。 [imf,residual,info] vmd(x) 函数的输入: 这里的x是待…...

SQLite软件架构与实现源代码浅析
概述 SQLite 是一个用 C 语言编写的库,它成功打造出了一款小型、快速、独立、具备高可靠性且功能完备的 SQL 数据库引擎。本文档将为您简要介绍其架构、关键组件及其协同运作模式。 SQLite 显著特点之一是无服务器架构。不同于常规数据库,它并非以单独进…...

JAVA实战开源项目:精简博客系统 (Vue+SpringBoot) 附源码
本文项目编号 T 215 ,文末自助获取源码 \color{red}{T215,文末自助获取源码} T215,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
Flink SQL 编程详解:从入门到实战难题与解决方案
Flink SQL 编程详解:从入门到实战难题与解决方案 Apache Flink 是当前流批一体实时计算的主流框架之一,而 Flink SQL 则为开发者提供了用 SQL 语言处理流式和批量数据的能力。本文将全面介绍 Flink SQL 的基础概念、编程流程、典型应用场景、常见难题及…...
GO+RabbitMQ+Gin+Gorm+docker 部署 demo
更多个人笔记见: github个人笔记仓库 gitee 个人笔记仓库 个人学习,学习过程中还会不断补充~ (后续会更新在github和 gitee上) 文章目录 目录准备运行测试postman检查容器 链接:项目连接,完整项目代码仓库下…...

通过openpyxl在excel中插入散点图
实现代码 # -*- coding: utf-8 -*- """ Created on Sat May 31 23:30:12 2025author: anyone """from openpyxl import load_workbook from openpyxl.chart import ScatterChart, Reference, Series from openpyxl.chart.series import SeriesL…...

基于cornerstone3D的dicom影像浏览器 第二十五章 自定义VR调窗工具
文章目录 前言一、三维调窗原理二、自定义三维调窗工具三、调用流程1. 修改mprvr.js2. 修改DispalyerArea3D.vue3. view3d.vue4. Toolbar3D.vue 总结 前言 从cornerstoneTools BaseTool派生VolumeShiftColorTool,实现鼠标键按下并移动时,对3D窗口的pres…...
针对 Harmony-Cordova 性能优化,涵盖原生插件开发、线程管理和资源加载等关键场景
1. 原生图片处理插件(Java) package com.example.plugin; import ohos.media.image.ImageSource; import ohos.media.image.PixelMap; import ohos.app.Context; public class ImageProcessor { private final Context context; public ImagePro…...