快速近似光流/图像偏移


9

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

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

图像很大且通常是均匀的低对比度场景,我没有任何明显的高光要跟踪。我需要实时(60fps)且不使用所有CPU。

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

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

Answers:


3

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

MPEG4-还有另一个关键概念,称为“ 全局运动补偿 ”,该技术试图首先估计和补偿摄像机的运动和平移。这样做的好处是,根据复杂性,这些方法可以更简单或更详尽。下面是一个例子纸张和另一纸张的一样。

通常,摄像机平移和运动估计是相当成熟的研究领域。这是参考:另一种纸

关于这个问题。您会发现严谨,准确的算法以及简单快速的算法。


如果我可以方便地使用MPEG库,那我记得Mpeg中的GMC受到了批评。我认为由于相机稳定算法的原因,这将是一个常见的领域
Martin Beckett 2012年

您绝对可以挂钩(或更确切地说,提取)MPEG算法。您可以将FFMPEG用作库并提取出来-但可能会有些棘手。或者,你可以阅读整齐的码MSSG来提取。
Dipan Mehta 2012年

关于对GMC的批评-大大降低比特率并创建基于对象的编码是更多的承诺。但是,估计摄像机运动参数并不难。
Dipan Mehta 2012年

谢谢,我将看一下MSSG。我用ffmpeg,但是要把东西拉出来不是一个简单的库!
马丁·贝克特

3

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

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

这个问题很相似,除了互相关之外,没有人提出其他建议,所以也许还不错:使用MATLAB计算连续图像之间的偏移量


谢谢,很容易假设FFT慢,但是我可以做一个2 ^ n的小窗口。ps。仅用于搜索stackoverflow.com/questions/1100100/…–
马丁·贝克特

3

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

因此,我的分步指南将是:

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

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


0

我认为互相关是找到偏移量的一种好方法,但是如果您想真正快速地进行偏移,则可以尝试将其限制为仅一条垂直扫描线和一条水平扫描线(即穿过图像中心)。计算两个帧中扫描线之间的互相关性应该可以使您获得水平和垂直偏移的近似值。


这可能有用,但如果对角平移,即使横向平移只是上下晃动,也无法正常工作。我认为图像中心的矩形子区域会更好。
endolith'4
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.