优化多相机立体校准过程

4

背景:

为了简单起见,我有3个摄像头。每个摄像头都经过自己的校准(其内部参数已知且足够准确)。它们共享几乎相同的视角。我想利用这个由3个摄像头组成的系统进行三维重建。我已经分别对每一对摄像头进行了校准(1和2、2和3以及1和3),得到了3个变换矩阵。理论上,这3个变换矩阵应该具有以下特性:

T13 = T12 * T23 

或者用另一种公式表示:
 T31 * T12 * T23 = Identity

然而,在实际情况下,这并不是真的。由于校准误差,结果会略微偏离相同的矩阵。
Error = [T31 * T12 * T23] - [Identity]        Eq.3

问题:

我觉得每对相机单独进行校准是一个不好的想法。通过应用某种全局优化来将整个三对相机融合在一起,试图最小化方程(3)的误差应该会给出更好的结果。

我的问题是:

这个问题是否有已知的先前工作?有没有使用OpenCV实现我的目标的想法,所以我不必重新发明轮子。


也许你可以使用一些在图像拼接中直接或间接使用的“束调整”技术。 - Micka
如果您能解释需要哪些进一步的细节,那将会很有帮助。您的问题需要更多的代码行在SO答案中粘贴。据我所知,这不能完全在OpenCV中完成,因为OpenCV没有捆绑调整API,甚至不公开其相机校准例程使用的LM优化器。 - Francesco Callari
@FrancescoCallari 谢谢。是的,我正在寻找类似于OpenCV中LM优化器的东西。这个想法实际上是来自于slamming。我在OpenCV中正在寻找这样的解决方案。看起来我需要自己构建它,或者我应该使用三维校准物体,并从PCL获取一些帮助(他们已经支持LUM)。 - Humam Helfawi
对于少量的相机,任何通用的LM实现都可以胜任(参见Numerical Recipes、minpack,甚至是scipy.optimize.least_squares)。最好使用真正的捆绑软件,例如Ceres,它可以很好地处理相机旋转的参数化,这样您就不必在成本函数中重新发明轮子。 - Francesco Callari
1个回答

5

当然,过去很多相机的集合已经被联合校准过了(你看过黑客帝国中的“子弹时间”效果吗?Manex团队最初就是这样完成的:https://www.youtube.com/watch?v=uPNBdDNZbYk

您可以使用初始的成对校准作为一轮举行束调整的初始化点。最好使用在所有图像中都可见的刚性三维对象(而不是平面的“棋盘”目标,您需要一个具有实际深度的目标),并使用涵盖视场和感兴趣深度的多个图像。如果这是一个一次性项目,则可以在具有良好GUI的半自动工具中轻松完成图像匹配和捆绑。我过去曾满意地使用Blender(www.blender.org)完成这些任务。请在线寻找有关在Blender中进行运动匹配的教程。


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