Python OpenCV立体相机位置

4
我希望确定立体相机在世界坐标系中相对于其先前位置的位置和方向。我正在使用Bumblebee XB3相机,立体成像对之间的运动大约为几英尺。
下面是正确的步骤:
  1. 获取每一对图像的校正图像
  2. 检测/匹配校正图像上的特征点
  3. 计算基础矩阵
  4. 计算本质矩阵
感谢您的帮助!

听起来你走在正确的轨道上。但是,有几个问题:关于相机之间的校准怎么样(即,您是否假设已经完成了这项工作)?关于两个相机与世界的校准怎么样(即,您是否假设拍摄中存在任何已知物体,您可以围绕其移动 - 具有已知的尺寸和/或标记)?您希望从立体上下文中获得什么(即,您是否希望通过利用深度来获得更高的精度)? - timlukins
1
你是否对相对运动感兴趣,从某个任意的初始位置开始(例如,相机移动了[dx,dy,dz]),或者对已知世界坐标系内的绝对运动感兴趣(例如,如果你手头有一个世界模型,并且相机现在位于[x,y,z])? - timlukins
好问题,鉴于我对CV术语和实践的有限经验,我会尽力回答。先回答第二个问题,因为它可能是最相关的。我真的很想要绝对运动,因为我正在尝试实现一个户外移动映射系统,通过将GPS(当其已知良好)与在GPS不好时使用视觉里程计(?)相结合。我曾经假设摄像头(立体对)已经由制造商校准好了彼此之间的关系,或者您是指“摄像头对”?如果是后者,那么我不知道这是必需的。 - user1667061
意译:我意识到我可能没有回答所有能帮助你帮助我的问题!立体声背景的原因是,在我最初实现系统时,我可以轻松获得地理参考(世界)点云数据(我想要的交付成果之一)。然而,我天真地认为,每个立体对产生的数据会通过我将相机定位到轨道上的机械手段而被相当好地对齐。现在我知道了更多,我意识到通过结合一些计算机视觉方法,我可以做得更好。所以我的系统有一个立体相机,因为我不知道有更好的选择。 - user1667061
1个回答

4

好的,听起来你对自己想要做的事情有一定的了解!拥有预校准的立体相机(例如Bumblebee)将在需要时提供点云数据 - 但是似乎你还想使用相同的图像执行视觉里程计(当然是正确的术语),并从上一个已知GPS位置提供绝对方向,当GPS失效时。

首先 - 我想知道你是否查阅过文献以获取更多想法:通常只需要知道该搜索什么。在导航中“传感器融合”的整个概念 - 特别是在GPS失去信号的城市区域 - 促进了一整个研究领域。因此,以下(交叉)研究领域可能对你有所帮助:

所有这些方法都可能会遇到以下问题:

  • 处理静态和动态场景(即仅基于相机运动而改变的场景-与其他因场景中独立运动而改变的场景相比:树木移动、汽车驶过等)。
  • 将视觉运动量与真实世界运动量相关联(我提到的另一种“校准”形式-物体是小还是远?这就是立体信息可能非常方便的地方,我们将看到...)
  • 问题的分解/优化-特别是处理随着时间摄像机路径上累积误差和异常特征(所有行业技巧:束调整、RANSAC等)

所以,实际上,您想通过Python(通过OpenCV绑定)来完成这项工作?

如果您正在使用OpenCV 2.4,则(结合C / C ++和Python的)新API文档在此处

作为起点,我建议查看以下示例:

/OpenCV-2.4.2/samples/python2/lk_homography.py

这提供了一个使用函数cv2.findHomography从光流中进行基本自我运动估计的良好实例。

当然,这个单应性矩阵H仅适用于点共面(即在相同投影变换下位于同一平面上的点——因此它可以用于漂亮的平坦道路的视频)。但是,按照同样的原则,我们可以使用基础矩阵F来代替对极几何中的运动。这可以通过非常类似的函数cv2.findFundamentalMat计算得出。

最终,正如您在问题中正确指定的那样,您需要基本矩阵E——因为这是在实际物理坐标系中操作的矩阵(不仅仅是沿着极线映射像素之间的关系)。我总是认为基础矩阵是基本矩阵的推广,其中摄像机内部校准(K)的(不重要的)知识被省略,反之亦然。

因此,这些关系可以正式表示为:

E =  K'^T F K

因此,您仍然需要了解立体相机标定K的一些知识!有关更多信息,请参见著名的Hartley&Zisserman book

例如,您可以使用函数cv2.decomposeProjectionMatrix来分解本质矩阵并恢复R方向和t位移。

希望这可以帮助您!最后警告一句:这绝不是针对真实世界数据复杂性的“已解决问题” - 因此持续进行研究!


很棒的回复,Tim。正是我所期望的,而且还多了一些! - user1667061
我前几天拿起了Hartley&Zisserman的书,以及Szeliski的一本书,试图获得更广泛的理解。关于神秘的内部参数(K)的跟进。在我的情况下,似乎我有一个相机f = 801.408020(像素),ppX = 324.561127和ppY = 240.855042(使用Point Grey库提取)。那么我的(K)可以写成([801.408020,0,324.561127],[0,801.408020,240.855042],[0,0,1])吗? - user1667061
很棒,你得到了这本书。手动计算K对于现实世界的相机来说有点危险。你上面的工作看起来还不错 - 但它假设了一个“针孔”相机模型,并使用了那些精确的参数。真正的相机具有需要更复杂的模型来适应畸变和其他效果的光学系统。真正确定相机内部参数的唯一方法是使用能够有效描述光学和成像系统的模型进行校准。这并不太难,只需查看基于棋盘格模式校准的OpenCV函数即可。 - timlukins

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