【计算机视觉】opencv姿态解算6 理论算法调研 PNP问题 5种算法

本文详细介绍了PnP(Perspective-n-Point)算法的各种方法,包括P3P、EPnP及迭代法等,并对比了它们在不同场景下的适用性和准确性。同时,文章还深入探讨了POSIT算法的工作原理以及Robust Planar Pose (RPP)算法的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于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.

solvePnP里有三种解法:P3P, EPnP,迭代法(默认)(opencv3里多了DLS和UPnP解法)

OpenCV提供了三种方法进行PNP计算,三种方法具体怎么计算的就请各位自己查询opencv documentation以及相关的论文了,我看了个大概然后结合自己实际的测试情况给出一个结论,不一定正确,仅供参考:

方法名

说明

测试结论

CV_P3P

这个方法使用非常经典的Gao方法解P3P问题,求出4组可能的解,再通过对第四个点的重投影,返回重投影误差最小的点。

论文《Complete Solution Classification for the Perspective-Three-Point Problem

可以使用任意4个特征点求解,不要共面,特征点数量不为4时报错

CV_ITERATIVE

该方法基于Levenberg-Marquardt optimization迭代求解PNP问题,实质是迭代求出重投影误差最小的解,这个解显然不一定是正解。

实测该方法只有用4个共面的特征点时才能求出正确的解,使用5个特征点或4点非共面的特征点都得不到正确的位姿。

 

只能用4个共面的特征点来解位姿

CV_EPNP

该方法使用EfficientPNP方法求解问题,具体怎么做的当时网速不好我没下载到论文,后面又懒得去看了。

论文《EPnP: Efficient Perspective-n-Point Camera Pose Estimation

对于N个特征点,只要N>3就能够求出正解。


注意点1: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组点。

2方法简说

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)

### 计算机视觉PnP姿估计 #### PnP问题定义及其重要性 在计算机视觉领域,PnP (Perspective-n-Points) 是一种用于决从3D空间点到2D图像平面对应关系的问题的技术[^5]。该技术旨在利用已知的世界坐标系下若干个三维点的置与其对应的二维图像投影来推断摄像机姿态参数——包括置和朝向。 #### 不同类型的点对匹配方式 对于不同类型的点对(如2D-2D, 2D-3D 和 3D-3D),存在特定的方法来进行处理: - **2D-2D 对极几何**:当仅有两张图片间的特征点对应时,则需依赖于对极几何原理进行分析[^1]。 - **2D-3D PnP 方法**:这是最典型的场景之一,在这种情况下可以直接应用经典的PnP算法相机外参矩阵。 - **3D-3D ICP 算法**:如果两个数据集均为三维点云形式,则可以采用迭代最近点(ICP)等方法完成配准操作。 #### 基于不同类型摄像头的决方案 针对不同的成像设备特性,也发展出了多种针对性强的技术路径: - 单目相机由于只提供单一视角的信息量有限,所以往往需要额外假设或辅助手段才能有效获取深度信息并进一步估姿态; - 双目立体视觉系统则能够通过视差效应直接测量距离从而简化了后续计流程; - 而结构光/ToF类深度传感装置更是能即时给出精确的距离读数,使得整个过程变得更加直观可靠[^2]。 #### ORB-SLAM 中的具体实践案例 实际项目里比如ORB_SLAM就采用了上述提到的一些策略组合起来实现了鲁棒高效的实时定功能。它会先提取关键帧内的FAST角点作为自然标志物,并借助词袋模型加速检索速度;接着运用BA优化框架不断调整当前最佳猜测直至收敛至全局最优附近[^4]。 ```cpp // C++代码片段展示如何调用OpenCV库函数solvePnPRansac执行一次完整的pnp cv::Mat rvec, tvec; std::vector<int> inliers; bool found = cv::solvePnPRansac(object_points, image_points, camera_matrix, dist_coeffs, rvec, tvec, false, 100, 8.0, 0.99, inliers); if (!found){ std::cout << "Failed to find a valid pose." << std::endl; } ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值