为什么直接线性变换(DLT)不能提供最佳的相机外部效应?

zha*_*hen 7 opencv least-squares extrinsic-parameters opencv-solvepnp

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

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

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

BCo*_*nic 13

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

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

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

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

现在回答你的问题的标题:当然,DLT算法给出了最佳的摄像机外部效应,但它仅在DLT算法解决的线性成本函数意义上是最优的.多年来,科学家发现更复杂的成本函数导致更准确的解决方案,但也更难以解决.

  • 是的,有办法从12DOF提取6DOF相机姿势(例如使用SVD,就像你说的那样).然而,这种变换并没有被DLT算法的线性最小二乘问题所覆盖,因此你最终会得到一个6DOF相机姿态,在你的线性最小二乘成本函数意义上它不再是最优的.要将6DOF姿态估计嵌入到最小二乘问题中,您需要一个非线性函数,我们知道最小化非线性函数的最佳方法是通过迭代求解器(例如Levenberg-Marquardt算法). (2认同)