哪个是计算视频帧运动的更好方法?

时间:2012-12-21 13:04:38

标签: visual-c++ opencv opticalflow

为了找到连续的帧运动差异,我使用了帧的绝对差值,然后对所有像素求和以量化运动量。我在OpenCV中做到了这一点。

但我最近了解了Horn和Schunk的光流算法和基于宏块的运动补偿。 OpenCV库已经具有可以计算它们的内置函数。但我不知道如何量化它们。它们比第一种方法更好吗?

请帮忙!

3 个答案:

答案 0 :(得分:2)

在opencv中实现光流的方式是......

  1. 最初检测某些点作为跟踪(感兴趣的点)帧中的好特征(比如FrameA),其中要跟踪的目标出现......某些点可能位于目标上,有些点可能位于背景上...
  2. 检测到的点存储在矢量数组中,并与FrameA和FrameB一起传递给光流功能...后一个(FrameB)是下一帧,我们打算找到感兴趣点的位置...
  3. 当我们得到FrameB中感兴趣点的位置时,我们可以估计FrameA和FrameB之间感兴趣点的位移......
  4. 对于您的情况......因为您正在进行帧运动计算...使用背景减法(帧差异...)作为启动帧的技术,您可以从中开始寻找感兴趣的点...当变化超过阈值开始获取兴趣点...在下一个连续帧中跟踪它们,你可以制作一个直方图,显示在下一帧中有多少位移已经消失了多少...这就是我所能做到的现在考虑量化帧运动...

答案 1 :(得分:1)

虽然我对特定的opencv实现没什么经验,但我可以告诉你,光流通常不会尝试量化运动量。您可以根据光流向量的长度(例如,对块速度求和)在输出上定义度量,但这是与您使用的度量非常不同的度量。如果这对您有用,取决于应用程序。为了进行比较,考虑一个灰色物体在白色背景下移动而不是一个黑色物体在白色背景下移动。您的帧差异度量标准会将黑色物体视为更多运动,而块速度度量的总和将将其视为大致相同的运动量。

答案 2 :(得分:0)

最后,您还应该考虑方法的运行时间。差异图像的计算复杂度非常低,可以在几毫秒内估算。但是你无法对物体的速度进行分类。例如,摇动相机会产生问题。 不太快的是基于光流的方法,例如金字塔形的Lucas Kanade或Horn Schunk方法,但是你得到每个像素(密集方法,如Horn Schunk)或一组预定义像素(稀疏方法,如金字塔形Lucas Kanade)a运动矢量。因此,您现在可以在不同的移动对象之间进行抖动,或者只使用计算出的运动矢量的长度。但运行时间约为200ms到2秒,取决于参数,帧大小和计算的矢量数等。