我正在读取OpenCV中函数 solvePnP() 的源代码,当flags参数使用默认值SOLVEPNP_ITERATIVE时,它称为 cvFindExtrinsicCameraParams2 ,其中FIRST首先使用 DLT 算法(如果我们有一组非平面的3D点集)来初始化6DOF相机姿态,然后SECOND使用CvLevMarq solver最小化重投影误差。

我的问题是:DLT将问题模拟为线性最小二乘问题,并通过SVD分解解决,这似乎是一个最佳解决方案,为什么我们此后仍然使用Lev-Marq迭代方法?

或者,劣等的DLT算法的问题/局限性是什么?为什么封闭形式的解决方案导致成本函数的 LOCAL 最小值?

最佳答案

当您想找到问题的解决方案时,第一步是用数学术语来表达该问题,然后您可以使用现有的数学工具来找到方程式的解决方案。但是,有趣的问题通常可以用许多不同的数学方法来表示,每种方法可能导致略有不同的解决方案。然后,需要进行工作以分析不同的方法,以了解哪种方法提供最稳定/准确/高效/等的解决方案。

在PnP问题的情况下,我们希望找到在3D点与其投影图像平面之间具有关联的相机姿势。

数学上表达此问题的第一种方法是将其转换为线性最小二乘问题。这种方法被称为DLT方法,它很有趣,因为线性最小二乘法具有一个封闭形式的解决方案,可以使用奇异值分解可靠地找到该解决方案。但是,此方法假定摄影机姿态P实际上只有6个时(12个自由度为3(3D旋转为3加3D平移为3))。为了从该方法的结果中获得6DOF摄像机姿态,需要一个近似值(DLT的线性成本函数未涵盖该近似值),从而导致解决方案不准确。

数学上表示PnP问题的第二种方法是将几何误差用作代价函数,并找到使几何误差最小的相机姿态。由于几何误差是非线性的,因此该方法使用迭代求解器(例如Levenberg Marquardt算法)来估算解决方案。这样的算法可以考虑相机姿态的6个自由度,从而得出精确的解决方案。但是,由于它们是迭代方法,因此需要为它们提供解决方案的初始估计,而在实践中通常是使用DLT方法获得的。

现在回答您的问题的标题:当然,DLT算法可提供最佳的相机外部效果,但仅在DLT算法解决的线性成本函数意义上是最佳的。多年来,科学家发现更复杂的成本函数导致更准确的解决方案,但也更难解决。

关于opencv - 为什么直接线性变换(DLT)无法提供最佳的相机外部效果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43827812/

10-09 13:19