【视觉SLAM】4b-特征点法估计相机运动之PnP 3D-2D

ops/2024/11/20 10:51:21/

文章目录

  • 0. 前言
  • 1. PnP求解
    • 1.1 直接线性变换DLT
    • 1.2 P3P
    • 1.3 光束平差法BA
  • 2. 实现

0. 前言

透视n点(Perspective-n-Point,PnP)问题是计算机视觉领域的经典问题,用于求解3D-2D的点运动。换句话说,当知道 N N N个世界坐标系中3D空间点的坐标以及它们在图像上的投影点像素坐标时,可以使用PnP算法来估计相机在世界坐标系的姿态。P3P是最简化的PnP形式,即最少只需3个点即可估计当前的相机姿态(解不唯一)。

总体来说,PnP的求解方法有P3P、直接线性变换(Direct Linear Transformation,DLT)、EPnP(Efficient PnP)和UPnP等。此外,还有非线性优化解法,通过构建最小二乘问题并迭代求解,即万金油式的光束平差法(Bundle Adjustment,BA)

PnP_7">1. PnP求解

1.1 直接线性变换DLT

假设有世界坐标系中的3D点 P = [ X , Y , Z , 1 ] T P=[X, Y, Z, 1]^T P=[X,Y,Z,1]T,在图像 I 1 I_1 I1中对应的投影像素点为 x 1 = [ u 1 , v 1 , 1 ] T x_1=[u_1, v_1, 1]^T x1=[u1,v1,1]T,根据相机小孔成像模型有:

s [ u 1 v 1 1 ] = [ R ∣ t ] P = [ t 1 t 2 t 3 t 4 t 5 t 6 t 7 t 8 t 9 t 10 t 11 t 12 ] [ X Y Z 1 ] s \begin{bmatrix} u_1 \\ v_1 \\ 1 \end{bmatrix}= \begin{bmatrix} R | t \end{bmatrix} P= \begin{bmatrix} t_1 & t_2 & t_3 & t_4 \\ t_5 & t_6 & t_7 & t_8 \\ t_9 & t_{10} & t_{11} & t_{12} \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z \\ 1 \end{bmatrix} s u1v11 =[Rt]P= t1t5t9t2t6t10t3t7t11t4t8t12 XYZ1

其中 s = Z s=Z s=Z,利用最后一行将其消去有:

{ s u 1 = t 1 X + t 2 Y + t 3 Z + t 4 s v 1 = t 5 X + t 6 Y + t 7 Z + t 8 s = t 9 X + t 10 Y + t 11 Z + t 12 ⇒ { u 1 = t 1 X + t 2 Y + t 3 Z + t 4 t 9 X + t 10 Y + t 11 Z + t 12 v 1 = t 5 X + t 6 Y + t 7 Z + t 8 t 9 X + t 10 Y + t 11 Z + t 12 \begin{cases} s u_1 = t_1 X + t_2 Y + t_3 Z + t_4\\ s v_1 = t_5 X + t_6 Y + t_7 Z + t_8\\ s = t_9 X + t_{10} Y + t_{11} Z + t_{12} \end{cases} \Rightarrow \begin{cases} u_1 = \frac{t_1 X + t_2 Y + t_3 Z + t_4}{t_9 X + t_{10} Y + t_{11} Z + t_{12}} \\ v_1 = \frac{t_5 X + t_6 Y + t_7 Z + t_8}{t_9 X + t_{10} Y + t_{11} Z + t_{12}} \\ \end{cases} \\ su1=t1X+t2Y+t3Z+t4sv1=t5X+t6


http://www.ppmy.cn/ops/135214.html

相关文章

Centos 7 修改YUM镜像源地址为阿里云镜像地址

安装 wget 1 yum install -y wget 进入目录 1 cd /etc/yum.repos.d/ 创建目录 1 mkdir backup 默认源配备份 1 mv C* backup/ 下载阿里云yum源 1 wget -O /etc/yum.repos.d/CenOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 清除旧缓存 1 yum c…

homework系列

(4)输出整数各位数字:输人一个整数number&#xff0c;从高位开始逐位分割并输出它的各位 数字。试编写相应程序。 输人输出示例 Enter a number:123456 输出 1 2 3 4 5 6 #include <iostream>int main() {int m 0, i 1, j 1, k 1;int count 0;printf("Enter …

在Ubuntu上部署Open WebUI和Ollama,打造你的私人GPT

在Ubuntu上部署Open WebUI和Ollama&#xff0c;打造你的私人GPT 如果你对自然语言处理或者构建自己的对话AI感兴趣&#xff0c;那么这篇文章就是为你准备的。我将带你一步步搭建Open WebUI和Ollama&#xff0c;让你在自己的服务器上就能体验到强大的语言模型。 简介 Ollama是…

C++类和对象(下)

文章目录 1. 初始化列表1.1 什么是初始化列表1.2 为什么要引入初始化列表1.3 初始化列表如何写1.3.1 显式写初始化列表1.3.2 隐式写初始化列表1.3.2.1 不声明缺省值1.3.2.2 声明缺省值 1.3.3 初始化列表总结 2.类型转换2.1 内置类型与自定义类型转换2.2 自定义类型间的转换2.3 …

Python 正则表达式进阶用法:边界匹配

Python 正则表达式进阶用法&#xff1a;边界匹配 正则表达式是一种强大的工具&#xff0c;用于处理文本中的模式匹配。它广泛应用于文本查找、替换、数据清洗等任务。在学习了正则表达式的基础知识后&#xff0c;掌握更高级的用法将使得正则表达式的应用更加灵活。边界匹配&am…

2.5D视觉——Aruco码定位检测

目录 1.什么是Aruco标记2.Aruco码解码说明2.1 Original ArUco2.2 预设的二维码字典2.3 大小Aruco二维码叠加 3.函数说明3.1 cv::aruco::detectMarkers3.2 cv::solvePnP 4.代码注解4.1 Landmark图说明4.2 算法源码注解 1.什么是Aruco标记 ArUco标记最初由S.Garrido-Jurado等人在…

开源控件:Qt/C++自定义异形窗口和颜色选择器 【工程源码联系博主索要】

使用 Qt 和 C 实现一个异形窗口和自定义颜色选择器的过程。 1. CustomShapeWidgetUi 类 该类实现了一个具有自定义形状和颜色选择功能的窗口。 构造函数 CustomShapeWidgetUi CustomShapeWidgetUi::CustomShapeWidgetUi(const QString &imagePath, QDialog *parent): QD…

【GNU】addr2line

1、什么是addr2line addr2line 是 GNU Binutils 工具集中的一个命令行工具&#xff0c;用于将程序中的地址转换为源代码中的文件名和行号。它在调试和问题定位中非常有用&#xff0c;尤其是在处理崩溃或 core dump 时。 2、常用选项 选项功能-e <file>指定目标文件&am…