快速近似光流/图像偏移

信息处理 图像处理 光流 运动检测
2021-12-26 15:57:14

我需要检测摄像机平移的速度(水平/垂直)以警告操作员减速。

整个图像作为一个块移动,我不需要实际的方向(尽管 H 或 V 会是一个奖励),我只需要一个近似的幅度 - 即。如果在帧之间移动超过“N”个像素,则触发。

图像是大且通常均匀的低对比度场景,我没有任何明显的亮点要跟踪。我需要在不使用所有 CPU 的情况下实时完成 (60fps)。

Niave 解决方案是在中心选择一个 RoI,找到边缘,计算帧对之间的相似性,将其中一个帧向左/右/上/下移动一个像素,重复 - 找到最小值。

我想知道是否有更聪明的解决方案?

4个回答

如果您正在寻找一种简单的方法,可能是应用在 MPEG 类压缩编解码器中非常成熟的标准运动估计算法。它们很容易理解,我想你会得到很多现成的代码。该算法逐块生成运动矢量 - 然后您可以找到最突出的集群并获取平均运动矢量方向和幅度。

MPEG4 - 有另一个称为“全局运动补偿”的关键概念,这是一种尝试首先估计和补偿摄像机运动和平移的技术。美妙之处在于,这些方法可以更简单或详尽,具体取决于复杂性。这是一篇示例论文和另一篇相同的论文。

一般来说,相机平移和运动估计是一个相当成熟的研究领域。这是一个参考:论文另一篇论文

关于这个话题。你会发现既严谨又准确的算法以及简单快速的算法。

这可能是一个缓慢而糟糕的解决方案,但您可以对后续帧进行基于 FFT 的互相关,然后找到峰值以识别帧之间的偏移。也许只在图像的一小部分上执行此操作以节省处理器周期。

它不适用于旋转或从一帧到下一帧的剧烈场景变化,并且可能有更好的方法。这是一种“我有一把锤子,所以一切看起来都像钉子”的解决方案。我想这就像您的幼稚解决方案一样,除了不需要边缘检测并且 FFT 比一次显式移动一个像素要快得多。

这个问题很相似,除了互相关之外没有人提出任何建议,所以也许还不错:Using MATLAB to calculate offset between continuous images

您可以估计速度和方向的一种方法是对图像中心的四个窗口进行“局部”流量估计。Lucas-Kanade 微分方法假设位移近似恒定,因此可以作为方程求解。

所以我的分步指南将是:

  1. 获取图像中心的像素窗口,例如 20x20
  2. 计算梯度 Ix 和 Iy。
  3. 将渐变窗口分成四块,例如 4x10x10。
  4. 用下一帧求解四个线性最小二乘方程。
  5. 平均四个速度向量。

这决定了方向和速度,但是您可以使用加权窗口使其更加稳健。查看Lucas-Kanade 方法的扩展。

我认为互相关是找到偏移量的好方法,但是如果您想真正快速地做到这一点,那么您可以尝试将其限制为仅单个垂直和单个水平扫描线(即通过图像的中心。)计算两帧中扫描线之间的互相关应该可以为您提供水平和垂直偏移的近似值。