尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

PnP问题详解:从视觉定位原理到SLAM/AR工程实践

PnP问题详解:从视觉定位原理到SLAM/AR工程实践 1. 项目概述从三维到二维的“定位”难题在计算机视觉和机器人领域我们经常遇到一个核心问题如何通过相机“看到”的世界反过来确定相机自身在三维空间中的位置和姿态这个问题听起来有点绕但想象一下你拿着手机在室内导航手机摄像头拍到了天花板的几个已知位置的灯系统就能立刻计算出你手机在房间里的精确位置和朝向。这个“由像求位”的过程就是经典的PnPPerspective-n-Point问题。PnP问题的输入很简单一组三维空间中的已知点比如地图上标记好的路标点以及这些点在二维图像平面上的投影坐标。输出则是相机的旋转矩阵R和平移向量t也就是所谓的相机外参。这就像解一个几何谜题已知物体在真实世界中的形状和它在照片上的样子求拍摄这张照片时相机的位置和角度。这个问题是视觉里程计VO、同时定位与地图构建SLAM、增强现实AR等技术的基石。没有稳定高效的PnP求解机器人就不知道自己在哪里AR的虚拟物体也无法稳稳地“贴”在真实桌面上。从数值计算的角度看PnP问题本质上是一个非线性最小二乘问题。我们寻找最优的R和t使得三维点投影到图像平面上的理论位置与实际观测到的像素位置之间的误差平方和最小。今天我们就来彻底拆解这个“最小二乘问题详解”系列中的关键一环——PnP求解。我不会只停留在公式表面而是会带你深入几种主流求解方法的内部看看它们是如何构建误差方程、如何处理旋转矩阵的特殊约束、又是如何高效迭代得到最优解的。无论你是正在搭建视觉SLAM系统还是想在AR应用中实现精准跟踪理解这些细节都至关重要。2. PnP问题的数学模型与误差构建要解决一个问题首先得把它用数学语言清晰地定义出来。PnP问题的核心数学模型建立在相机的小孔成像模型之上。2.1 坐标变换与投影模型假设我们有一个三维世界点 ( P^w [X^w, Y^w, Z^w]^T )上标w表示世界坐标系。相机有自己的坐标系相机坐标系点P在相机坐标系下的坐标为 ( P^c [X^c, Y^c, Z^c]^T )。世界坐标系到相机坐标系的变换由旋转矩阵 ( R )3x3正交矩阵和平移向量 ( t )3x1决定 [ P^c R P^w t ]接下来是投影。在小孔模型中相机坐标系下的点 ( P^c ) 被投影到归一化平面Z1的平面上得到归一化坐标 ( [x, y]^T [X^c/Z^c, Y^c/Z^c]^T )。最后通过相机内参矩阵 ( K )包含焦距和主点坐标归一化坐标被转换到像素坐标系 [ \begin{bmatrix} u \ v \ 1 \end{bmatrix} K \begin{bmatrix} x \ y \ 1 \end{bmatrix} K \begin{bmatrix} X^c/Z^c \ Y^c/Z^c \ 1 \end{bmatrix} ] 这里 ( (u, v) ) 就是我们观测到的二维像素坐标。2.2 构建重投影误差PnP的求解目标是找到一组 ( R ) 和 ( t )使得所有三维点投影计算得到的像素坐标 ( \hat{u}_i, \hat{v}_i ) 与其实测像素坐标 ( u_i, v_i ) 尽可能接近。最常用的度量就是重投影误差Reprojection Error。对于第i个点对其重投影误差定义为 [ e_i \begin{bmatrix} u_i \ v_i \end{bmatrix} - \pi(K, R, t, P^w_i) ] 其中 ( \pi(\cdot) ) 代表上述完整的投影函数。那么对于N个点对PnP问题就转化为一个非线性最小二乘问题 [ \min_{R, t} \sum_{i1}^{N} | e_i |^2_2 \min_{R, t} \sum_{i1}^{N} \left| \begin{bmatrix} u_i \ v_i \end{bmatrix} - \pi(K, R, t, P^w_i) \right|^2_2 ]这里有一个关键约束旋转矩阵 ( R ) 必须属于特殊正交群 SO(3)即 ( R^T R I ) 且 ( \text{det}(R) 1 )。这个约束使得问题是非线性和非凸的直接求解困难。不同的PnP算法核心区别就在于如何处理这个旋转约束以及采用何种策略来最小化这个误差。注意内参标定的重要性在讨论PnP求解前必须假设相机内参矩阵 ( K ) 是已知且准确的。如果 ( K ) 本身有较大误差那么无论多优秀的PnP算法得到的外参也会有很大偏差。在实际项目中务必先进行高精度的相机标定。3. 经典PnP求解算法深度剖析面对这个非线性最小二乘问题研究者们发展出了从闭式解到迭代优化的一系列方法。每种方法都有其适用的场景和优缺点。3.1 直接线性变换DLT当点数n≥6时我们可以忽略旋转矩阵的正交约束将问题线性化求解这就是DLT方法的基本思想。我们将投影方程改写为齐次形式。 由 ( s \begin{bmatrix} u \ v \ 1 \end{bmatrix} K [R | t] P^w )其中s是深度尺度因子可以将其写为 [ s \begin{bmatrix} u \ v \ 1 \end{bmatrix} \begin{bmatrix} p_{11} p_{12} p_{13} p_{14} \ p_{21} p_{22} p_{23} p_{24} \ p_{31} p_{32} p_{33} p_{34} \end{bmatrix} \begin{bmatrix} X^w \ Y^w \ Z^w \ 1 \end{bmatrix} ] 这里 ( P K[R|t] ) 是一个3x4的投影矩阵共有12个未知数但只有11个自由度因为尺度任意。消去尺度因子s可以得到两个关于 ( p_{ij} ) 的线性方程 [ \begin{cases} X^w p_{11} Y^w p_{12} Z^w p_{13} p_{14} - u(X^w p_{31} Y^w p_{32} Z^w p_{33} p_{34}) 0 \ X^w p_{21} Y^w p_{22} Z^w p_{23} p_{24} - v(X^w p_{31} Y^w p_{32} Z^w p_{33} p_{34}) 0 \end{cases} ] 每个点提供两个方程。当有6个或以上点时我们可以构建一个形如 ( A \mathbf{p} 0 ) 的齐次线性方程组其中 ( \mathbf{p} ) 是投影矩阵P的12个元素拉成的向量。通过奇异值分解SVD求解 ( A^T A ) 最小特征值对应的特征向量即可得到 ( \mathbf{p} ) 的估计在相差一个尺度因子的意义下。得到 ( \mathbf{p} ) 后我们需要从中分解出内参 ( K ) 和外参 ( R, t )。由于我们假设K已知所以可以直接从 ( P ) 的前三列记为 ( M )恢复 ( R )。理论上 ( M KR )所以 ( R K^{-1} M )。但这样直接计算出来的 ( R ) 通常不满足正交约束( R^T R \neq I )。因此我们需要对 ( R ) 进行“正交化”最常见的方法是对其做SVD分解令 ( R U \Sigma V^T )则最优的旋转矩阵在Frobenius范数意义下为 ( R U V^T )。最后平移向量 ( t K^{-1} \mathbf{p}_4 / \sigma )其中 ( \mathbf{p}_4 ) 是P的第四列( \sigma ) 是尺度因子通常取 ( \sigma | \text{前三列} |_F / \sqrt{3} ) 来归一化。实操心得DLT的陷阱与用途DLT求解非常快因为它只是一个线性SVD问题。但它有两个主要缺点1) 完全忽略了旋转矩阵的约束解的质量依赖于足够多的点来“平均”掉约束违反带来的误差2) 对噪声比较敏感。在实际中我很少直接使用DLT的结果作为最终解但它是一个极佳的初始化工具。当你需要一个快速的、哪怕粗糙的初始估计来启动后续的非线性优化时DLT是不二之选。在SLAM的视觉初始化阶段经常能看到它的身影。3.2 P3P三点的几何奥秘当只有3个点时n3DLT需要至少6个点因此不适用。P3P算法利用三角形的几何性质仅用3个点就能求出有限数目的解最多4组。这是它的最大优势也是其应用场景如基于3个特征点的快速位姿估计。P3P的核心思想是利用余弦定理。设三个三维点 ( A, B, C ) 在世界坐标系中的位置已知它们在相机光心O的投影为 ( a, b, c )。令 ( OA, OB, OC ) 的长度分别为 ( d_A, d_B, d_C )这是未知数。而 ( AB, BC, CA ) 的长度可以根据世界坐标计算记为 ( R_{AB}, R_{BC}, R_{CA} )。在图像中我们可以测量出角 ( \angle AOB, \angle BOC, \angle COA )记为 ( \theta_{AB}, \theta_{BC}, \theta_{CA} )。对三角形OAB应用余弦定理( R_{AB}^2 d_A^2 d_B^2 - 2 d_A d_B \cos(\theta_{AB}) )。同理对OBC和OCA可以得到另外两个方程。这样就得到了一个关于 ( d_A^2, d_B^2, d_C^2 ) 的方程组。通过巧妙的变量代换如令 ( x d_B^2 / d_A^2, y d_C^2 / d_A^2 )可以将这个三元二次方程组化为一元四次方程。求解这个四次方程最多可得到4个正根每个根对应一组 ( (d_A, d_B, d_C) )。一旦知道了距离 ( d_A, d_B, d_C )点A、B、C在相机坐标系下的坐标就确定了因为它们分别在从光心O出发、方向由像素坐标反投影得到的射线上距离已知。接下来求解一个3D-3D的配准问题即寻找最优的R t将世界坐标系下的ABC变换到刚求出的相机坐标系下的坐标这可以用闭式解如SVD方法轻松完成。注意事项P3P的多解性与稳定性P3P最多产生4组解需要通过第4个点进行验证选择重投影误差最小的那组作为正确解。P3P对噪声非常敏感特别是当三个点共线或接近共线时问题会变得病态。在实际应用中通常不会单独使用P3P而是采用RANSAC框架随机采样3个点用P3P求解然后用所有点计算重投影误差来评估这个解迭代多次选择最优。这是视觉SLAM中应对误匹配的标配流程。3.3 EPnP高效且稳定的代表EPnPEfficient PnP是当前应用最广泛的非迭代方法之一。它的核心创新在于参数化方式不直接求解相机位姿而是先求解三维点在相机坐标系下的坐标然后再从中恢复位姿。EPnP选择4个非共面的虚拟控制点可以是四个三维点的质心以及PCA主方向上的点。那么任何一个三维点 ( P_i^w ) 都可以表示为这4个控制点 ( C_j^w ) 的加权和 [ P_i^w \sum_{j1}^{4} \alpha_{ij} C_j^w, \quad \text{且} \quad \sum_{j1}^{4} \alpha_{ij} 1 ] 权重 ( \alpha_{ij} ) 在世界坐标系下是固定的可以提前算出。关键假设是这个加权关系在相机坐标系下依然成立 [ P_i^c \sum_{j1}^{4} \alpha_{ij} C_j^c ] 现在未知数变成了4个控制点在相机坐标系下的坐标 ( C_j^c )共12个未知数。将 ( P_i^c ) 的表达式代入投影方程对于每个点i我们可以得到两个关于 ( C_j^c ) 的线性方程。收集所有N个点的方程形成一个形如 ( M \mathbf{x} 0 ) 的齐次线性系统其中 ( \mathbf{x} ) 是由12个未知坐标拉成的向量。这个方程的解是 ( M^T M ) 的零空间。通过SVD我们可以得到这个零空间的一组基。EPnP证明在无噪声情况下真正的解 ( \mathbf{x} ) 是这组基向量的线性组合( \mathbf{x} \sum_{k1}^{N} \beta_k \mathbf{v}_k )其中 ( \mathbf{v}_k ) 是零空间基向量( \beta_k ) 是未知系数。通过引入控制点之间的距离在世界坐标系和相机坐标系下保持不变这一约束可以构建一个关于 ( \beta_k ) 的二次方程组。求解这个方程组规模很小就能得到 ( \beta_k )进而得到 ( \mathbf{x} )即控制点在相机坐标系下的坐标。最后我们有了所有三维点在两个坐标系世界系和相机系下的坐标再次通过求解一个3D-3D的配准问题SVD就能得到最终的相机位姿R和t。实操心得为什么EPnP如此受欢迎EPnP的复杂度是O(n)对于点数很多的情况依然很快。它求解的是一个线性系统SVD数值稳定性很好。最重要的是它直接求解出了三维点在相机坐标系下的坐标这个中间结果有时非常有用。在SLAM中我经常用EPnP来求解帧间位姿它提供了比DLT更好、比纯迭代方法更快的初始值。对于大多数“正常”场景点分布良好、噪声适中EPnP是首选的闭式解法。4. 非线性优化Bundle Adjustment的精髓闭式方法DLT P3P EPnP虽然快但通常不是最优解因为它们要么忽略了约束DLT要么依赖于中间几何关系P3P EPnP。为了得到最高精度的位姿我们最终需要诉诸非线性优化也就是捆绑调整Bundle Adjustment BA在PnP问题上的应用。这直接求解我们最初定义的非线性最小二乘问题。4.1 李群李代数参数化直接优化旋转矩阵R非常困难因为其9个参数受6个约束正交行列式为1。聪明的做法是使用旋转矩阵的李代数 ( \phi )一个3维向量或其对应的四元数来表示旋转。这样优化变量就从受约束的R变成了无约束的 ( \phi )。平移向量t本身就是3维无约束向量。因此我们优化的参数是6维的向量 ( \xi [\phi, t] \in \mathfrak{se}(3) )。此时重投影误差函数变为 [ e_i(\xi) z_i - \pi(K, \exp(\xi^{\wedge}), P_i^w) ] 其中 ( \exp(\cdot) ) 是指数映射将李代数 ( \xi ) 映射为变换矩阵 ( T [R|t] )。我们的目标是最小化总误差 [ \min_{\xi} \frac{1}{2} \sum_{i1}^{N} | e_i(\xi) |^2_2 ]4.2 高斯-牛顿法与雅可比矩阵推导这是一个标准的非线性最小二乘问题通常用高斯-牛顿法Gauss-Newton或列文伯格-马夸尔特法Levenberg-Marquardt求解。这些方法的核心是迭代线性化。假设当前估计位姿为 ( \xi )我们寻求一个增量 ( \Delta \xi )使得误差减小 [ \min_{\Delta \xi} \frac{1}{2} \sum_{i} | e_i(\xi \Delta \xi) |^2 \approx \min_{\Delta \xi} \frac{1}{2} \sum_{i} | e_i(\xi) J_i \Delta \xi |^2 ] 这里 ( J_i ) 是误差 ( e_i ) 关于李代数增量 ( \Delta \xi ) 的雅可比矩阵它是整个优化过程的关键。推导这个雅可比矩阵需要链式法则。误差 ( e [e_u, e_v]^T )。 首先误差关于相机坐标系下点 ( P^c ) 的导数2x3矩阵 [ \frac{\partial e}{\partial P^c} - \begin{bmatrix} \frac{f_x}{Z^c} 0 -\frac{f_x X^c}{(Z^c)^2} \ 0 \frac{f_y}{Z^c} -\frac{f_y Y^c}{(Z^c)^2} \end{bmatrix} ] 其中 ( f_x, f_y ) 是相机内参中的焦距。其次相机坐标系下点 ( P^c ) 关于李代数增量 ( \Delta \xi ) 的导数。根据李群扰动模型当给变换矩阵左乘一个微小扰动 ( \exp(\Delta \xi^{\wedge}) ) 时有 [ \frac{\partial (TP^w)}{\partial \Delta \xi} \begin{bmatrix} I -P^{c \wedge} \end{bmatrix} ] 这是一个3x6的矩阵其中 ( P^{c \wedge} ) 是 ( P^c ) 的反对称矩阵。将两者结合得到最终的雅可比矩阵 ( J_i )2x6矩阵 [ J_i \frac{\partial e_i}{\partial \Delta \xi} \frac{\partial e_i}{\partial P^c} \frac{\partial P^c}{\partial \Delta \xi} - \begin{bmatrix} \frac{f_x}{Z^c} 0 -\frac{f_x X^c}{(Z^c)^2} \ 0 \frac{f_y}{Z^c} -\frac{f_y Y^c}{(Z^c)^2} \end{bmatrix} \begin{bmatrix} I -P^{c \wedge} \end{bmatrix} ]有了雅可比矩阵高斯-牛顿法的增量方程就是 [ \left( \sum_{i1}^{N} J_i^T J_i \right) \Delta \xi^* - \sum_{i1}^{N} J_i^T e_i ] 求解这个线性方程Hessian矩阵 ( H \sum J_i^T J_i ) 是6x6的很小得到增量 ( \Delta \xi^* )然后更新位姿估计( \xi \leftarrow \xi \Delta \xi^* )。迭代此过程直至收敛。实操心得优化中的数值技巧鲁棒核函数重投影误差平方和L2范数对误匹配Outliers非常敏感。一个错误的匹配点会产生巨大的误差把优化拉偏。因此必须使用鲁棒核函数如Huber核或Cauchy核。它们能降低大误差项的权重。在Ceres Solver或g2o中这是一个简单的配置选项但效果是决定性的。信息矩阵如果知道每个特征点检测的不确定性比如通过特征尺度估算可以给每个误差项赋予一个权重信息矩阵这能进一步提升精度。初始化的重要性非线性优化严重依赖初始值。一个糟糕的初始值比如来自严重误匹配的DLT解会导致优化陷入局部极小值甚至发散。务必用一个可靠的闭式解如EPnP作为非线性优化的初始值。5. 工程实践从理论到代码的跨越理解了原理我们来看看如何在实际项目中应用和实现PnP求解。这里我以最常见的流程为例特征点匹配 RANSAC EPnP/非线性优化。5.1 完整流程与工具链一个稳健的PnP求解流程通常包含以下步骤特征提取与匹配从当前图像和已知三维点地图中提取特征点如ORB SIFT并进行匹配。RANSAC鲁棒估计 a. 随机从匹配对中选取一个最小子集例如4对点用于EPnP3对点用于P3P。 b. 用这个子集计算一个相机位姿假设。 c. 用这个假设位姿将所有地图点投影到图像计算所有匹配对的重投影误差。设定一个阈值如2个像素统计内点误差小于阈值的点数量。 d. 重复步骤a-c多次次数由内点比例自适应决定保留内点数量最多的那个位姿假设及其对应的内点集合。精优化使用RANSAC筛选出的所有内点进行非线性优化Bundle Adjustment得到高精度的最终位姿。在C中OpenCV库提供了丰富的PnP函数封装cv::solvePnP这个函数是集大成者通过flags参数可以选择不同的求解方法SOLVEPNP_ITERATIVE基于Levenberg-Marquardt的迭代法需要较好的初始值内部会默认用DLT初始化。SOLVEPNP_EPNP使用EPnP算法。SOLVEPNP_P3P使用P3P算法需要恰好4个点3个求解1个验证。SOLVEPNP_AP3PSOLVEPNP_IPPE等更多选项。cv::solvePnPRansac这个函数直接集成了RANSAC流程你只需要输入所有匹配点包含外点它内部会随机采样、调用指定的PnP方法、验证内点并返回最优位姿和内点索引。这是工程上最推荐使用的函数它省去了自己实现RANSAC循环的麻烦。一个典型的使用solvePnPRansac的代码片段如下// 已知vectorPoint3f objectPoints (世界坐标) vectorPoint2f imagePoints (像素坐标) Mat cameraMatrix Mat distCoeffs Mat rvec tvec; // 旋转向量和平移向量 vectorint inliers; // 使用RANSAC框架的EPnP求解 bool success solvePnPRansac(objectPoints imagePoints cameraMatrix distCoeffs rvec tvec false // 不使用初始估计值 SOLVEPNP_EPNP // 使用EPnP方法求解最小子集 0.99 // 置信度 2.0 // 重投影误差阈值像素 inliers); // 输出内点索引 if(success) { // 可选仅用内点进行最终的非线性优化Iterative Mat rvec_refined rvec.clone() tvec_refined tvec.clone(); solvePnP(refinedObjectPoints refinedImagePoints cameraMatrix distCoeffs rvec_refined tvec_refined true // 使用上一步的结果作为初始值 SOLVEPNP_ITERATIVE); // 将旋转向量rvec_refined转换为旋转矩阵R Mat R; Rodrigues(rvec_refined R); }5.2 参数调优与性能考量RANSAC迭代次数solvePnPRansac的迭代次数是自适应计算的依赖于你设定的置信度如0.99和预估的内点比例。如果场景中误匹配很多可以适当增加迭代次数上限通过maxIters参数。重投影误差阈值这个阈值是判断内点的关键。通常设置为1-3个像素。太松会纳入外点太严则会丢掉好的匹配点。可以根据你特征点的定位精度来调整。畸变校正在将像素坐标传入PnP求解前务必确保已经用cv::undistortPoints函数去除了镜头畸变或者确保你的像素坐标已经是去畸变的。否则成像模型不满足小孔假设求解结果会系统性地不准。尺度问题对于单目相机从PnP求解出的平移向量t的尺度是任意的与三维点的真实尺度一致。如果你的三维地图点是以米为单位重建的那么t的单位就是米。在单目SLAM中这个尺度需要通过其他手段如IMU、已知物体尺寸来确定否则会产生尺度漂移。6. 常见问题、调试技巧与实战陷阱即使理解了所有原理在实际编码和调试中你依然会踩到各种各样的坑。下面是我从无数个项目调试中总结出来的经验。6.1 问题排查清单当你发现PnP求解结果不对位姿跳变、跟踪丢失时可以按照以下清单逐项排查问题现象可能原因排查方法与解决方案求解失败(返回false)1. 输入点数不足。2. 点共线或共面病态问题。3. 三维点坐标或像素坐标存在NaN/Inf。1. 检查objectPoints和imagePoints的size确保≥4对于EPnP或符合所选方法要求。2. 打印三维点坐标检查是否近似共线。增加点数量或确保点分布在不同深度和方向上。3. 添加数据有效性检查过滤掉无效数值。位姿结果明显错误(如平移量巨大)1. 坐标系混淆。2. 三维点尺度与相机内参不匹配。3. 误匹配点过多RANSAC失效。1. 确认世界坐标系、相机坐标系、图像坐标系的定义是否与代码一致。画图验证。2. 检查三维点单位米/毫米与相机焦距像素单位的匹配性。进行量纲一致性检查。3. 降低RANSAC重投影误差阈值检查inliers数量/比例。如果内点比例过低如30%需要检查特征匹配环节。位姿抖动严重1. 特征点观测噪声大。2. 用于求解的点数太少。3. 没有使用非线性优化进行精化。1. 使用更稳定的特征点如SIFT代替FAST或对特征点坐标进行亚像素精度细化。2. 增加用于求解的匹配点数量或使用所有内点进行BA优化。3. 在RANSAC后务必用所有内点进行SOLVEPNP_ITERATIVE优化。尺度不确定或漂移(单目)1. 这是单目PnP的固有特性。2. 三维点云本身的尺度未校正。1. 对于单目SLAM需要通过回环检测或融合IMU来估计和校正尺度。2. 在初始化阶段引入一个已知尺寸的物体来固定尺度。在边缘区域求解差1. 图像边缘畸变大去畸变不彻底。2. 边缘特征点定位精度低。1. 使用更准确的畸变模型如理性模型或直接裁剪掉边缘区域的特征点。2. 避免使用太靠近图像边缘的特征点进行PnP求解。6.2 调试与可视化技巧重投影可视化这是最有效的调试手段。将求解得到的位姿作用于所有三维点计算其重投影位置并在原图上用圆点画出来。同时用十字或方块画出原始的图像特征点。如果求解正确圆点和十字应该基本重合。任何明显的偏差都一目了然。// 伪代码 projectPoints(objectPoints rvec tvec cameraMatrix distCoeffs projectedPoints); for (int i 0; i inliers.size(); i) { circle(image imagePoints[inliers[i]] 5 Scalar(0 255 0)); // 绿色圆原始点 circle(image projectedPoints[inliers[i]] 3 Scalar(0 0 255) 2); // 红色圈重投影点 }内点/外点分析将RANSAC找到的内点用绿色绘制外点用红色绘制。观察外点的分布它们是随机分散的还是聚集在某些物体上如果聚集说明可能是动态物体或错误匹配区域。数值检查打印出求解出的旋转矩阵R检查其是否近似正交R*R.t()是否接近单位阵且行列式是否接近1。平移向量t的大小是否合理例如对于车载相机相邻帧的平移通常不会超过几米。6.3 性能优化要点在实时系统如SLAM、AR中PnP求解常常是性能瓶颈之一。优化点包括控制点数非线性优化中计算雅可比矩阵和Hessian矩阵的复杂度与点数成正比。如果内点很多100可以考虑只使用一部分如随机选取50个进行优化或者使用更稀疏的方法。提前拒绝在进入RANSAC循环前可以进行一些快速的几何验证比如计算匹配点对的基础矩阵或单应矩阵提前过滤掉明显错误的匹配减少RANSAC的无效迭代。多线程RANSAC本身非常适合并行化。可以尝试并行运行多个假设生成与验证线程。选择最快的求解器对于对精度要求不高的跟踪环节可以只用EPnP甚至DLT而把完整的BA优化放到一个独立的、低频率的线程中运行。最后记住PnP只是一个工具它的输出质量严重依赖于输入的质量——准确的三维点、精确的像素观测、以及正确的匹配关系。在视觉系统中花精力提升前端特征匹配的稳健性往往比纠结于选择哪个PnP求解器带来的收益大得多。当你构建系统时要把PnP看作一个黑盒但必须清楚地知道它的输入输出、局限性和失效模式这样才能在问题出现时快速定位到是前端匹配的故障还是后端优化本身的问题。
返回列表