PnP

本文主要介绍关于PnP(pespective-n-point)的一些方法。这个问题是一个经典的视觉测量问题。这里介绍一下常用的几种方法

问题的方案、解决思路

最小PnP问题

P3P问题中假设没有噪声,使用几何约束,可以解得相机的位姿。不具有唯一解。
P4P问题中分为线性方法和基于P3P的方法。

最小二乘的观点

  • 迭代最小化一个代价函数(平方误差)。这些方法相对于之前的方法更加准确,在一定的噪声的情况下,返回一个最大似然估计。
  • 直接最小二乘方法DLS

常用方法

  • NPL: The N-Point Linear (NPL) method of Ansar and Daniilidis [1].
  • EPnP: The approach of Lepitit et al. [16].
  • SDP: The Semi Definite Program (SDP) approach of Schweighofer and Pinz [23].
  • DLS: The Direct Least-Squares (DLS) solution presented in this paper. An open source implementation of DLS is available at www.umn.edu/ ̃joel
  • DLS-LM: Maximum-likelihood estimate, computed using iterative Levenberg-Marquardt (LM) minimization of the sum of the squared reprojection errors, initialized with DLS.

opencv

solvePnP里有三种解法:P3P, EPnP,迭代法(默认);opencv2里参数分别为CV_P3P,CV_EPNP,CV_ITERATIVE (opencv3里多了DLS和UPnP解法)。
注意点2:solvePnP需要至少3组点:P3P只使用4组点,3组求出多个解,第四组确定最优解;EPnP使用大于等于3组点;迭代法调用cvFindExtrinsicCameraParams2,进而使用SVD分解并调用cvFindHomography,而cvFindHomography需要至少4组点。
具体过程如下
- 将空间点和图像点齐次化,得到图像点矩阵 m 空间点矩阵 M ,求取矩阵M的平均值 Mc
- 计算另外一个矩阵 mm=(MMc)T(MMc)
- 对空间点矩阵 mm 进行SVD分解, mm=UWV
- Rt=V
- Tt=McRt
- Mxy=VtMT+Tt
- find homography between ( m Mxy )得到矩阵 H
- H=[h1,h2,t] ,然后归一化
- h1=h1h1
- t=th1+h2
- h3=h1×h2
- H:=[h1,h2,h3]
- 最终结果 Rf=HRt
- tf=HTt+t

其他

R的第i行 表示摄像机坐标系中的第i个坐标轴方向的单位向量在世界坐标系里的坐标;
R的第i列 表示世界坐标系中的第i个坐标轴方向的单位向量在摄像机坐标系里的坐标;
t 表示世界坐标系的原点在摄像机坐标系的坐标;
-R的转置 * t 表示摄像机坐标系的原点在世界坐标系的坐标。(原理如下图,t表示平移,T表示转置)

DLS

  1. http://onlinelibrary.wiley.com/doi/10.1002/rob.21620/epdf
  2. http://www.voidcn.com/blog/abc20002929/article/p-2288889.html
  3. http://blog.youkuaiyun.com/aptx704610875/article/details/48915149
  4. https://github.com/gaoxiang12/rgbd-slam-tutor2/blob/master/src/pnp.cpp
### PnP 技术概述 PnP(Plug and Play,即插即用)技术在不同领域中有着不同的含义。在计算机视觉领域,PnP 通常指的是 **Perspective-n-Point** 问题,其核心任务是通过一组 3D 点及其对应的 2D 图像投影,求相机的位姿(旋转和平移)。这一问题在增强现实、机器人定位、三维重建等领域具有广泛应用[^1]。而在人机交互和可穿戴设备领域,PnP 也可以指代 **Physical Non-inertial Poser**,这是一种基于惯性测量单元(IMU)的人体姿态捕捉系统[^2]。 ### Perspective-n-Point(PnP)算法 PnP 问题的核心是通过已知的 3D-2D 点对应关系,估计相机的外部参数(旋转和平移矩阵)。常见的算法包括 **P3P**、**EPnP**、**UPnP** 和 **迭代优化方法**(如 Levenberg-Marquardt)。这些方法在计算效率和鲁棒性方面各有优劣。 EPro-PnP 是一个基于 Python 的高效实现,特别优化了传统 PnP 算法的性能,提供简洁的接口以便集成到各类项目中。它适用于相机定位、增强现实和机器人导航等应用场景。 #### 数学模型 在 PnP 问题中,相机的内参通常已知,表示为: $$ K = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} $$ 其中 $ f_x, f_y $ 是相机在 u 轴和 v 轴方向上的尺度因子,$ (c_x, c_y) $ 是图像的主点坐标[^4]。 目标是求旋转矩阵 $ R $ 和平移向量 $ t $,使得: $$ s \cdot \begin{bmatrix} u_i \\ v_i \\ 1 \end{bmatrix} = K \cdot (R \cdot P_i + t) $$ 其中 $ P_i $ 是第 i 个 3D 点,$ (u_i, v_i) $ 是其在图像上的投影点,$ s $ 是深度缩放因子。 ### Physical Non-inertial Poser(PNP) 在人体姿态估计领域,Physical Non-inertial Poser(PNP)是一种基于 6 个惯性测量单元(IMU)的实时动作捕捉系统。它通过引入非惯性力模型,提升了传统基于 IMU 的姿态估计精度,适用于可穿戴设备和实时动作捕捉场景[^2]。 该系统在 PIP(Pure Inertial Poser)基础上增加了对非惯性力的建模,从而在动态运动中提高姿态估计的稳定性。系统架构包括传感器数据采集、预处理、姿态优化等模块。 #### 系统特点 - **实时性**:支持实时姿态估计,适用于交互式应用。 - **低硬件成本**:仅需 6 个 IMU 即可完成全身姿态捕捉。 - **高精度**:通过非惯性力建模,提升姿态估计的准确性。 ### 应用场景 PnP 技术广泛应用于多个领域: - **增强现实(AR)**:实现虚拟物体与真实场景的对齐。 - **机器人导航**:用于相机位姿估计,支持 SLAM 系统构建。 - **动作捕捉**:结合 IMU 的 PNP 系统可用于人体运动分析。 - **三维重建**:通过 PnP相机位姿,辅助多视角立体重建。 ### 开源项目与社区支持 在开源社区中,多个项目实现了 PnP 相关算法,如 EPro-PnP 和 Physical Non-inertial Poser。这些项目通常提供完整的文档和示例,便于开发者快速上手。同时,3D 视觉工坊等社区也鼓励开发者分享相关经验,推动 PnP 技术的发展[^3]。 ### 示例代码:使用 OpenCV 实现 PnP 以下是一个使用 OpenCV 进行 PnP 估计的简单示例: ```python import cv2 import numpy as np # 已知的 3D 点 points_3d = np.array([ [0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1] ], dtype=np.float32) # 对应的 2D 图像点 points_2d = np.array([ [320, 240], [400, 240], [320, 320], [280, 200] ], dtype=np.float32) # 相机内参矩阵 camera_matrix = np.array([ [800, 0, 320], [0, 800, 240], [0, 0, 1] ], dtype=np.float32) # 假设无畸变 dist_coeffs = np.zeros((4, 1)) # 使用 solvePnP位姿 success, rvec, tvec = cv2.solvePnP(points_3d, points_2d, camera_matrix, dist_coeffs) if success: print("旋转向量:", rvec) print("平移向量:", tvec) else: print("求失败") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值