关于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.
1 solvePnP里有三种解法:P3P, EPnP,迭代法(默认)(opencv3里多了DLS和UPnP解法)
方法名 |
说明 |
测试结论 |
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=(M−Mc)T(M−Mc)