10

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

我的问题是:DLT 将问题表述为线性最小二乘问题并用 SVD 分解来解决,这似乎是一个最优解,为什么我们之后仍然使用 Lev-Marq 迭代方法?

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

4

1 回答 1

19

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

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

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

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

现在回答您的问题的标题:当然,DLT 算法给出了最优的相机外在参数,但它仅在 DLT 算法解决的线性成本函数的意义上才是最优的。多年来,科学家们发现了更复杂的成本函数,导致更准确的解决方案,但也更难解决。

于 2017-05-13T14:11:36.973 回答