5

我看到与 opencv 运动检测相关的查询,但我的要求要简单得多,所以我再次问这个问题。我想分析视频帧,看看帧中是否发生了变化。帧中发生的任何类型的运动都已被识别。我只想在有事情发生时得到通知。我不需要跟踪/绘制轮廓。

尝试

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

我使用 cvMinMaxLoc & 得到相似度指数

if( sim_index > threshold ) 
    "Nothing chnged"
   else
    "Changed


面临的问题

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

2) 方法2
a) 做移动平均
b) 取当前帧和移动平均之间的绝对差。
c)对其进行阈值化并使其成为二进制
d)计算非零值的数量
再次陷入如何设置阈值的问题,因为即使对于非常相似的帧,我也会得到大量的非零值。

请告诉我我应该采取什么方法。我是否使用上述两种方法朝着正确的方向前进,或者是否有一种简单的方法可以在所有最通用的情况下工作。

4

1 回答 1

4

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

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

如果需要,您可以对motion_frame 设置阈值,然后计算非零值。但是您也可以将motion_frame 的元素和阈值相加(确保使用浮点数)。为此优化参数非常简单,只需制作两个轨迹栏并使用它。通常 alpha 约为 [0.1; 0.3]。

最后,在整个帧上执行此操作可能有点矫枉过正,您可以只使用二次采样版本,结果将非常相似。

于 2012-12-21T13:40:27.823 回答