首页 > 其他分享 >PnP and Perspective Projection and Pose Computation

PnP and Perspective Projection and Pose Computation

时间:2023-08-14 16:25:39浏览次数:41  
标签:begin end PnP Pose 投影 Perspective bmatrix Delta frac

PnP and Perspective Projection and Pose Computation

Review PnP problem from a computer graphics rendering view

首先从一个 StackExchange
问题出发,下面是本人的回答摘录。

Intrinsic Matrix vs. Projection Matrix

What is the difference between Intrinsic Matrix( K ) and Perspective Projection
Matrix(call it P Matrix later)?

  • For K Matrix it transform 3D points to 2D pixels in image space.
    And during this procedure only x and y value are concerned.
  • For P Matrix it transform 3D points to NDC space.

Take a look at two matrices:

\[K = \begin{bmatrix}f_x& 0& c_x\\ 0& f_y& c_y\\ 0 & 0 & 1\\\end{bmatrix}\]

\[P = \begin{bmatrix} \frac{1}{t*a}& 0& 0& 0\\0& \frac{1}{t}& 0& 0\\ 0 & 0 & A& B&\\ 0 & 0 & -1& 0\\ \end{bmatrix}\]

\[t=tan(\frac{fovy}{2}) \]

\[a=\frac{width}{height} \]

Let's add perspective divide and show the result of the above two matrices:

Intrinsic case: $$x_{2d} = \frac{x_0}{z_0 * \frac{1}{f_x}} + c_x$$

Perspective case: $$x_{2d} = \frac{x_0}{-z_0(t*a)}$$

Similar with some difference.

The image space: Origin from left-top corner
so should add Cx Cy as the offset from center to left-top corner.
And in NDC space we assume Z-axis direct out of screen so P(3,2) = -1.

从该问题引申,继续思考: PnP 问题中的投影过程如何体现?

Dig into solvePnP

我们看一下 PnP 问题的描述,下面这个公式来自 OpenCV 文档

\[\begin{align*} \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} &= \bf{A} \hspace{0.1em} \Pi \hspace{0.2em} ^{c}\bf{T}_w \begin{bmatrix} X_{w} \\ Y_{w} \\ Z_{w} \\ 1 \end{bmatrix} \\ \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} &= \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} \begin{bmatrix} r_{11} & r_{12} & r_{13} & t_x \\ r_{21} & r_{22} & r_{23} & t_y \\ r_{31} & r_{32} & r_{33} & t_z \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} X_{w} \\ Y_{w} \\ Z_{w} \\ 1 \end{bmatrix} \end{align*} \]

很遗憾,这里面是没有上一个段落所提及的 perspective divide.
为了再次确认,直接看一下 solvePnP 的 DLT 办法的原理,参考这个文章

直接假设一个带有12个未知数的 3x4 的矩阵作为未知数,并忽略其中的Rt含义,
然后将上式化简,建立一个关于未知3x4矩阵的方程。取6个点的数据共12行,
就可以直接进行求解。具体求解过程中的 SVD 分解求最小二乘解的过程不赘述。

注意:

  1. 整个过程没有透视除法 (perspective divide)
  2. 投影后的z值全部为 1 或者说为 λ

这正是这套逻辑与图形渲染中透视投影的很大的一个区别。
x y 的值没有根据 z 的大小进行缩放。z 全部投到了一个平面上。
据此分析,这套方法与其叫做 Perspective-n-Point 不如叫做
Orthographic-n-Point.

结论:

PnP 方法适用于正交投影下获得的 2D 点与原始世界坐标系中的 3D 点来计算
相机位姿,如果想适用普通的透视投影渲染,得到对齐的结果,还要想想别的办法才行。

How to compute object pose with Perspective Projection

我们考虑一个图形学常见的透视投影,投影矩阵 P 见第一部分的定义,
并加入透视除法 (最大的区别!)。

如果问题简化一下,假设 3D 物体和 2D 投影的朝向已经对齐,亦即旋转部分 R
已经完成。那么剩下需要计算的就只剩下了平移,这里因为是透视投影,所以在 Z 轴的平移
会直接影响最终成像的大小,这是之前 PnP 方法里面所没有涉及的。

如果旋转没有对齐,那么该怎么计算旋转呢?可以利用 SVD 分解得到旋转矩阵,暂先略过……

回到投影计算,投影的方程如下,其中 \(\Delta\) 是未知的平移变换。

\[\begin{align*} \begin{bmatrix} x' \\ y' \\ z' \\ w' \end{bmatrix} &= \bf{P} * (\begin{bmatrix} X_{w} \\ Y_{w} \\ Z_{w} \\ 1 \end{bmatrix} + \begin{bmatrix} \Delta_x \\ \Delta_y \\ \Delta_z \\ 0 \end{bmatrix} ) \\ \begin{bmatrix} X_{2d} \\ Y_{2d} \end{bmatrix} &= \begin{bmatrix} \frac{x'}{w'} \\ \frac{y'}{w'} \end{bmatrix} \end{align*}\]

将 P 用具体数值代入可得:

\[ \begin{align*} X_2d &= -\frac{X_w + \Delta_x}{t*a*(Z_w + \Delta_z)} \\ Y_2d &= -\frac{Y_w + \Delta_y}{t*(Z_w + \Delta_z)} \end{align*} \]

定义优化目标:

\[\Delta = arg \, \min\limits_{\Delta} 0.5(X_2d+\frac{X_w + \Delta_x}{t*a*(Z_w + \Delta_z)} + Y_2d + \frac{Y_w + \Delta_y}{t*(Z_w + \Delta_z)})^2 \]

使用高斯牛顿法迭代求解,并结合透视投影渲染,整体 3D 与 2D 的对齐效果好。

标签:begin,end,PnP,Pose,投影,Perspective,bmatrix,Delta,frac
From: https://www.cnblogs.com/psklf/p/17629004.html

相关文章

  • Nexpose v6.6.210 for Linux & Windows - 漏洞扫描
    Nexposev6.6.210forLinux&Windows-漏洞扫描Rapid7VulnerabilityManagement,ReleaseAug09,2023请访问原文链接:https://sysin.org/blog/nexpose-6/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org您的本地漏洞扫描程序搜集通过实时覆盖整个网络,随......
  • Aspose.Word 的常见使用(3)
    起因因项目需要,而且使用html转Word的时候,样式不兼容问题,于是只能使用Aspose.Word通过代码生成。下面是通过DocumentBuilder来设计Word的,但是和使用模型拼接的差不多,原理基本一致。思路这里是说使用Aspose.Word的使用思路,只想某个功能是怎么使用的可以跳过代码都是人写的,所以每......
  • 组合式api-ref引用子组件、dom元素, defineExpose的使用
    和vue2一样,我们有时候希望父组件能够调用子组件中的方法、属性。那么就要用到ref。然后你会发现,根本调用不了子组件中的方法"sonSayHi",如下图:原因:使用......
  • docker-compose搭建Ftp服务器
    version:"3"services:ftp:image:fauria/vsftpdcontainer_name:vsftpdhostname:ftpprivileged:trueuser:rootports:-"21:21"-"20:20"-"21100-21110:21100-21110"......
  • vue3怎么使用defineExpose
    在使用单文件组件<scriptsetup>创建一个子组件,会遇到父组件需要调用子组件的方法或变量的情况,这个时候,子组件中就需要使用defineExpose把子组件中那些需要被父组件调用的方法或变量给输出,方便父组件使用。 1.子组件在子组件中,定义updata方法、getData方法、num变量<templat......
  • docker-compose 安装MySQL(单实例)
    需求场景:在开发和测试环境中,或者研究型的环境,对于数据库的安全和稳定性可以稍低一些,那么我们可以通过docker快速部署MySQL服务,降低部署的时间成本。 vimdocker-compose.ymlversion:'3'services:mysql:restart:alwaysprivileged:trueimage:mysql:8.0......
  • 借助Aspose.Html 将 HTML 模板与 XML 或 JSON 合并
    在现代网络开发中,内容和表示的分离是一个基本原则。HTML模板提供了一种定义网页结构和布局的便捷方法,而JSON和XML数据格式通常用于存储和传输结构化信息。结合这些技术,开发人员可以根据外部源的数据动态生成HTML内容。在这篇博文中,我们将探讨如何在Java中将HTML模板与JS......
  • 使用Aspose.BarCode,在 Python 中扫描条码
    条形码是机器可读的数据表示形式,由平行线或几何图案直观地表示。它们提供了一种快速准确的方法来存储和检索信息,例如产品详细信息、库存代码或跟踪号码。条形码有多种类型,包括UPC、EAN、QR码等。每种类型都有特定的结构和编码机制。在这篇博文中,我们将学习如何构建高性能的Python......
  • 基于轻量级OpenPose的人体骨架提取
    1、项目源码及权重文件下载项目源码:https://github.com/Daniil-Osokin/lightweight-human-pose-estimation.pytorch/blob/master/demo.py权重文件:https://download.01.org/opencv/openvino_training_extensions/models/human_pose_estimation/checkpoint_iter_370000.pth需要注......
  • Android开发 Jetpack compose LazyColumn 与 LazyRow、LazyVerticalGrid、LazyHorizon
    前言  此篇博客讲解LazyColumn与LazyRow、LazyVerticalGrid、LazyHorizontalGrid,在compose里LazyColumn与LazyRow与是用来延迟加载数据的,它对标原来xml里的ListView与RecyclerView。LazyColumn纵向列表效果图代码@ComposablefunAPage(){vallistData=remembe......