使用OpenCV进行运动检测

时间:2012-12-20 18:58:20

标签: android opencv motion-detection

我看到与opencv运动检测相关的查询,但我的要求更简单,所以我再次提出问题。 我想分析视频帧,看看帧中是否有变化。已经识别出在帧中发生的任何类型的运动。如果发生某些事情,我只是想收到通知。我不需要跟踪/绘制轮廓。

尝试

1)使用OpenCV(TM_CCORR_NORMED)进行模板匹配。

我使用cvMinMaxLoc&

获得相似性指数
if( sim_index > threshold ) 
    "Nothing chnged"
   else
    "Changed


    面临的问题

我找不到决定如何设置阈值的方法。虚假匹配和完美的价值非常接近。

2)方法2
    a)使得平均值为     b)取当前帧与移动平均线之间的差值     c)将其阈值并使其成为二进制
    d)计算非零值的数量
    再次坚持如何对其进行阈值处理,因为即使对于非常相似的帧,我也会获得大量的非零值。

请告诉我应采取的方法。我是否正确地使用上述两种方法,或者是否有一种简单的方法可以在所有最通用的场景中使用。

1 个答案:

答案 0 :(得分:4)

方法2通常被认为是最简单的运动检测方法,如果您的视频中没有水,摇曳树木或高度可变的光照条件,则非常有效。 通常你会像这样实现它:

motion_frame=abs(newframe-running_avg);
running_avg=(1-alpha)*running_avg+alpha*newframe;

如果需要,可以对motion_frame进行阈值处理,然后计算非零值。但是你也可以只计算motion_frame和阈值的元素(确保使用浮点数)。为此优化参数非常简单,只需制作两个轨道栏并使用它即可。通常α约为[0.1; 0.3]。

最后,在整个帧上执行此操作可能有些过分,您可以使用子采样版本,结果将非常相似。