为了找到连续的帧运动差异,我使用帧的绝对差,然后将所有像素相加来量化运动量。我已经在OpenCV中这样做了。
但是我最近了解了Horn和Schunk的光流算法和基于宏块的运动补偿。OpenCV库已经内置了可以计算它们的函数。但我不知道如何量化它们。它们比第一种方法好吗?
请帮忙!
opencv中实现光流的方式是…
- 在要跟踪的目标出现的帧(比如FrameA)中,最初检测到一些点作为跟踪的好特征(兴趣点)…有些点可能在目标上,有些可能在背景上…
- 检测到的点存储在矢量数组中,并与FrameA和FrameB一起传递给光流函数…后一帧(FrameB)是下一帧,我们打算在其中找到兴趣点的位置… 当我们得到帧b中兴趣点的位置时,我们可以估计帧a和帧b之间兴趣点的位移…
对于你的情况…既然你在做帧运动计算…使用背景减法(帧差分…)作为启动帧的技术,从那里你可以开始寻找兴趣点…当变化超过一个阈值时,开始获取兴趣点……在接下来的连续帧中跟踪它们,你可以制作一个直方图,显示有多少兴趣点已经消失,在下一帧中有多少位移……这就是我现在所能想到的量化帧运动的方法
虽然我对特定的opencv实现没有多少经验,但我可以告诉您,光流通常不会尝试量化运动量。您可以根据光流矢量的长度(例如,将块速度相加)在输出上定义一个度量,但这与您使用的度量非常不同。这是否对您有用取决于应用程序。为了进行比较,想象一下在白色背景上移动的灰色物体和在白色背景上移动的黑色物体。你的帧差度量会将黑色物体视为更多的运动,而块速度度量的总和会将其视为大致相同的运动量。
最后,您还应该考虑方法的运行时。差分图像的计算复杂度非常低,可以在几毫秒内估计。但是你不能确定物体的速度。摇晃照相机会产生问题。基于光流的方法,如金字塔Lucas Kanade或Horn Schunk方法,速度较慢,但您可以为每个像素(密集方法,如Horn Schunk)或一组预定义像素(稀疏方法,如金字塔Lucas Kanade)获得一个运动向量。所以你现在能够区分不同的运动物体,或者你只需要使用计算的运动向量的长度。但是运行时间大约是200毫秒到2秒,这取决于参数,帧的大小和要计算的向量的数量等。