有没有办法在不知道深度 Z 的情况下从现实世界物体的运动中找到光流速度?
Posted
技术标签:
【中文标题】有没有办法在不知道深度 Z 的情况下从现实世界物体的运动中找到光流速度?【英文标题】:Are there any way to find optical flow velocity from motion of real-world object without knowing depth Z? 【发布时间】:2012-11-21 08:40:03 【问题描述】:我很挣扎,需要帮助。
我想根据现实世界物体的已知运动(实际上是相机在移动)计算光流速度。这是我在上一个问题 (Determining if a feature is part of a moving object from sparse optical flow (KLT)) 中提出的问题的一部分。
无论如何,我已经使用cvGoodFeaturesToTrack()
和cvCalcOpticalFlowPyrLK()
完成了光流计算。
我只是想检查一下我计算出的流量在理论上是否正确(对应于相机的运动)。
让我的相机只在 Z 轴上移动(暂时忽略偏航率)。假设我的相机移动到 Vz(在 Z 方向)。
我可以通过
找到光流vx = x * Vz / Z
vy = y * Vz / Z
(假设 Vx,Vy = 0 --> x 和 y 轴上没有相机运动)
这是我主要从http://www.cse.psu.edu/~rcollins/CSE486/lecture22_6pp.pdf学习的。
问题是要解决这个问题,我必须有 Z。就我而言,我不能假设表面 Z 是平坦的或已知的。摄像头在道路上移动并垂直于地面。
请任何人帮我回答以下问题:
-
如何获取物体的深度 Z 值?我需要额外的技术吗?
或者还有其他方法可以找到相机运动和图像光流之间的关系吗?
有人试过上面的公式吗?相机只向一个方向移动时是否有效?
非常感谢。
[如果您觉得这个问题太模糊,请告诉我,以便我提供更详细的信息。]
【问题讨论】:
如果您有多个摄像头,您可以使用立体视觉来确定距离。如果您有一个已知距离的参考对象,您可以计算另一个对象的视差并使用它来找到它的距离。除此之外,我担心任意物体的距离即使不是不可能也很难确定。 感谢您的 cmets。我的问题是针对单台相机的,我对其他参考对象一无所知。我已经尝试了多张图像,并假设前几对图像的光流是可靠的,并使用它们来计算 Z。无论如何,我发现这也是一个问题。 理论上您可以通过使用 8 点或 5 点方法估计基本矩阵并分解基本矩阵来获得 Z,但正如他们所说的“道路充满危险”。对于您尝试使用光流解决的问题,它可能也是一个更复杂的解决方案。 虽然你可以计算基本矩阵并将其分解为旋转和平移,但它始终是按比例缩放的,这意味着对于不同的连续图像对你得到的比例是不同的,所以您无法以这种方式获得相机的“真实”运动。最简单的解决方案是仅考虑主平面(地面)的光学矢量。如果没有,推理方法,如粒子过滤器(参见 Monoslam code.google.com/p/monoslam)可以完成这项工作。 【参考方案1】:也许这会有所帮助……来自中佛罗里达大学计算机视觉小组的视频讲座:
Chapter 6 - Optical Flow(您要求的方程式在视频的 31:00 分钟) Chapter 8 - Motion Models(处理偏航、倾斜、旋转的各种方法) Chapter 9 - Global Motion(解决自我运动问题,即移动相机)来自 Jan Erik Solem 的其他 python 代码:Programming Computer Vision with Python。
阅读第 10.4 章,它很可能会回答你所有的问题。
另请参阅该书的第 5.4 章,如果您使用相机拍摄图像,然后在 x 方向上稍微移动相机并拍摄另一张图像,您可以使用这两个图像计算称为“视差图”的东西说明图像中的正面和背面分别是什么类型的东西。这有点像弄清楚 z 方向。类似于您已经尝试过的内容以及一些 cmets 提到的有关立体成像的内容。
第 4.3 章解释了使用平面标记进行姿态估计。您可以使用放置在相机前面已知距离的物体来校准相机。这很可能是您应该首先查看的内容。
【讨论】:
以上是关于有没有办法在不知道深度 Z 的情况下从现实世界物体的运动中找到光流速度?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在不导入 csv 的情况下从 .csv 创建 JSON?
有没有办法在不创建视频标签的情况下从 URL 获取 MediaStream