【问题标题】:Python OpenCV stereo camera positionPython OpenCV立体相机位置
【发布时间】:2012-09-05 23:37:46
【问题描述】:

我想确定立体相机相对于其在世界坐标中的先前位置的位置和方向。我正在使用 Bumblebee XB3 相机,立体声对之间的运动大约是几英尺。

这会走上正确的轨道吗?

  1. 获取每对的校正图像
  2. 检测/匹配特征点校正图像
  3. 计算基本矩阵
  4. 计算基本矩阵

感谢您的帮助!

【问题讨论】:

  • 听起来你在正确的轨道上。但是,有几个问题:如何相互校准相机(即您是否假设这已经完成)?如何将两个相机校准到世界(即您是否假设任何初始已知物体都在周围拍摄您移动哪个 - 使用已知尺寸和/或标记)?您希望通过在立体环境中执行此操作获得什么(即您是否希望通过利用深度来获得更高程度的准确性)?
  • 从根本上说,您是否对从任意初始位置(例如相机移动 [dx,dy,dz])的相对运动或绝对 在已知的世界坐标系内运动(例如,如果您手头有一个世界模型并且相机现在位于 [x,y,z])?
  • 好问题,鉴于我在简历术语和实践方面的经验有限,我会尽力回答。首先是第二个问题,因为它可能最相关。我真的很喜欢绝对运动,因为我想要实现的是一个户外移动地图系统,通过耦合 GPS(当它已知良好时)并在 GPS 不好时使用视觉里程计(?)。我曾假设制造商已经对相机(立体声对)进行了相互校准,还是您指的是“相机对”?如果是第二个,那么我不知道这是必需的。
  • 意识到我可能没有回答所有可以帮助您帮助我的问题!立体环境的原因是,在我最初的系统实现中,我可以轻松获得地理参考(世界)点云数据(我想要的可交付成果之一)。然而,我天真地假设每个立体对的结果数据只需通过机械方式将相机对准我的轨道就可以很好地对齐。现在我知道的更多了,我意识到我可以通过结合一些 CV 方法做得更好。所以我的系统有一个立体摄像头,因为我不知道更好。

标签: python opencv computer-vision stereo-3d


【解决方案1】:

嗯,听起来您对自己想做的事情有相当的了解!拥有一个预先校准的立体相机(如 Bumblebee)将在您需要时提供点云数据 - 但听起来您基本上也想使用 相同 图像来执行视觉里程计(当然是正确的术语)并在 GPS 出现故障时从最后一个已知的 GPS 位置提供绝对方向。

首先要做的事情 - 我想知道您是否看过文献以获得更多想法:与以往一样,它通常只是知道谷歌搜索的内容。用于导航的“传感器融合”的整个想法——尤其是在 GPS 丢失的建筑区域——已经引发了一系列的研究。因此,也许以下(交叉)研究领域可能对您有所帮助:

所有这些方法您将遇到的问题包括:

  • 处理静态场景与动态场景(即纯粹根据摄像机运动而变化的场景 - 与其他因场景中发生的独立运动而变化的场景相比:树木移动、汽车驶过等)。
  • 将视觉运动量与现实世界运动相关联(我提到的另一种“校准”形式 - 物体是小还是远?这是立体信息可以证明非常方便的地方,正如我们将看到的...... )
  • 问题的分解/优化 - 尤其是处理相机路径上的累积误差和异常特征(所有交易技巧:捆绑调整、ransac 等)

那么,无论如何,从务实的角度来说,您想在 python 中执行此操作(通过 OpenCV 绑定)?

如果您使用的是 OpenCV 2.4,(结合 C/C++ 和 Python)新的 API 文档是 here

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

/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 位移。

希望这会有所帮助!最后一句警告:对于现实世界数据的复杂性,这绝不是一个“已解决的问题”——因此正在进行研究!

【讨论】:

  • 优秀的回应蒂姆,正是我所希望的加上一些!
  • 前几天我拿起了 Hartley & Zisserman 的书以及 Szeliski 的书,试图获得更广泛的理解。对神秘的内在参数 (K) 的跟进。似乎在我的情况下,我有一个相机 f = 801.408020(像素),ppX = 324.561127 和 ppY = 240.855042(这些是使用点灰色库提取的)。那么我的 (K) 可以写成 ([801.408020,0,324.561127],[0,801.408020,240.855042],[0,0,1]) 吗?
  • 很高兴你拿到了这本书。对于现实世界的相机来说,手动计算 K 有点危险。您在上面的工作看起来不错 - 但假设具有这些确切参数的“针孔”相机模型。真实相机的光学系统需要更复杂的模型来适应失真和其他效果。真正了解相机内在特性的唯一方法是使用能够有效描述光学和成像系统的模型进行校准。这并不难,只需看看基于棋盘模式校准的 OpenCV 函数即可。
猜你喜欢
  • 2021-09-01
  • 2018-02-13
  • 2012-12-30
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
  • 2017-02-10
相关资源
最近更新 更多