本文主要介绍关于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=(M−Mc)T(M−Mc)
- 对空间点矩阵
mm
进行SVD分解,
mm=UWV
-
Rt=V
-
Tt=−McRt
-
Mxy=VtMT+Tt
- find homography between (
m
和
Mxy
)得到矩阵
H
-
H=[h1,h2,t]
,然后归一化
-
h1=h1∥h1∥
-
t=t∥h1∥+∥h2∥
-
h3=h1×h2
-
H:=[h1,h2,h3]
- 最终结果
Rf=H∗Rt
-
tf=H∗Tt+t
其他
R的第i行 表示摄像机坐标系中的第i个坐标轴方向的单位向量在世界坐标系里的坐标;
R的第i列 表示世界坐标系中的第i个坐标轴方向的单位向量在摄像机坐标系里的坐标;
t 表示世界坐标系的原点在摄像机坐标系的坐标;
-R的转置 * t 表示摄像机坐标系的原点在世界坐标系的坐标。(原理如下图,t表示平移,T表示转置)