2012-12-20 89 views
4

我看到与opencv运动检测有关的查询,但我的要求更简单,所以我再次问这个问题。 我想分析视频帧并查看帧中是否发生了变化。在框架中发生的任何类型的运动都被认可。如果发生什么事我只想得到通知。我不需要追踪/绘制轮廓。制成运动检测使用OpenCV

尝试:

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

我得到使用cvMinMaxLoc &

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


面临的问题相似度指数:

我无法找到一个方法来决定如何设定阈值。错配和完美的价值非常接近。

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

请问我应该采取什么方法。我是用上述两种方法走向正确的方向,还是有一种简单的方法可以在所有大多数通用情况下工作。

+0

如果TM_CCORR_NORMED与Pearson Correlation Coefficient等价,那么取决于您的帧如何修改,您将很难确定此方法的良好阈值,因为没有好的阈值。但你没有清楚地说出你在第一种方法中做了什么。你是否将初始帧设置为基准帧,然后将每个新帧与它进行比较?然后,如果'sim_index'低于'threshold',则将此新框架标记为基础框架。重复。那是你的方法吗? – mmgp

回答

3

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

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

可以门槛motion_frame如果你想,再算上nonzeroes。但是,您也可以将motion_frame和threshold的元素相加(确保使用浮点数)。为此优化参数非常简单,只需制作两个轨道杆并进行操作即可。通常α是在[0.1; 0.3]。

最后,在整个帧上完成此操作可能是矫枉过正,您可以使用二次采样版本,结果会非常相似。