为什么直接线性变换(DLT)无法提供最佳的相机外参?

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

我的问题是:DLT将问题公式化为线性最小二乘问题,并使用SVD分解求解,这似乎是一个最优解,为什么我们还要之后使用Lev-Marq迭代方法呢?

或者说,DLT算法的问题/限制在哪里导致其表现较差?为什么闭合形式的解结果是成本函数的一个局部最小值?


我认为在外参估计中添加某种非线性细化的额外步骤是很常见的,这是通过迭代完成的。请参阅此处:http://www.epixea.com/research/multi-view-coding-thesisse9.html - Dan
@Dan 谢谢你的链接。我知道它很常见,就像 opencv 中的 CvLevMarq 求解器一样。我的意思是 DLT 似乎是一种闭式形式的最小化代价函数的方法,为什么它仍然比较低级(局部最小值)呢? - zhangxaochen
1个回答

25
当你想要找到问题的解决方案时,第一步是用数学术语表达这个问题,然后你可以使用现有的数学工具来找到你的方程的解。然而,有趣的问题通常可以用许多不同的数学方式表达,每种方式可能会导致稍微不同的解决方案。然后需要分析不同的方法,理解哪一个提供了最稳定/准确/高效等解决方案。
在PnP问题的情况下,我们想找到摄像机姿态,给定三维点和它们在图像平面上的投影之间的关联。
第一种将这个问题数学化的方法是将其作为线性最小二乘问题。这种方法被称为DLT方法,它很有趣,因为线性最小二乘具有闭合形式的解,可以使用奇异值分解稳健地找到。然而,这个方法假设相机姿态P有12个自由度,实际上只有6个(3个用于三维旋转加上3个用于三维平移)。从这个方法的结果中获得6DOF相机姿态需要一个近似(DLT的线性代价函数没有涵盖),导致不准确的解决方案。
第二种将PnP问题数学化的方法是使用几何误差作为代价函数,并找到最小化几何误差的相机姿态。由于几何误差是非线性的,这种方法使用迭代求解器(如Levenberg Marquardt算法)来估计解决方案。这样的算法可以考虑相机姿态的6个自由度,从而得到准确的解决方案。但是,由于它们是迭代方法,因此需要提供解决方案的初始估计,实际上通常使用DLT方法获得。
现在回答你问题的标题:当然,DLT算法可以给出最佳的摄像机外部参数,但仅在DLT算法求解的线性代价函数意义下是最佳的。多年来,科学家们发现了更复杂的代价函数,导致更准确的解决方案,但也更难以解决。

1
首先感谢您的回复~ 您的意思是DLT方法不如其他方法,因为它得到的是一个12自由度矩阵而不是一个刚性变换矩阵?但是据我所知,通过操作svd(H)=UWV^T然后result=VU^T确实可以得到一个精确的旋转矩阵(行列式为+1的正交矩阵)具有3个自由度,而不是9个自由度,对吗? - zhangxaochen
3
是的,有方法可以从12个自由度的相机位姿中提取6个自由度的位姿(例如使用SVD,就像您所说的那样)。然而,这种转换不包含在DLT算法的线性最小二乘问题中,因此您会得到一个不再是最优的6DOF相机位姿(在您的线性最小二乘代价函数意义上)。要将6DOF位姿估计嵌入到最小二乘问题中,您需要一个非线性函数,我们知道最好的方法是通过迭代求解器(例如Levenberg-Marquardt算法)来最小化非线性函数。 - BConic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接