使用OpenCV进行运动检测

5
我看到一些与 opencv 运动检测相关的查询,但我对它有一个更简单的需求,所以我再次提出问题。我想分析视频帧并查看帧中是否有任何变化。帧中发生的任何类型的运动都必须被识别。如果发生了什么,我只想得到通知。我不需要跟踪/绘制轮廓。
尝试过的方法: 1)使用OpenCV进行模板匹配(TM_CCORR_NORMED)。 我使用cvMinMaxLoc获取相似性指数。
if( sim_index > threshold ) 
    "Nothing chnged"
   else
    "Changed


面临的问题

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

2)方法2
a)做一个运行平均数
b)当前帧与移动平均数之间取绝对差。
c)将其阈化并使其成为二进制
d)计算非零值的数量
再次陷入困境,因为即使是非常相似的帧,我也获得了大量的非零值。

请建议我应该采取什么方法。我上述两种方法的方向正确吗?还是有一种简单的方法可以在几乎所有通用情况下工作。


如果TM_CCORR_NORMED等同于皮尔逊相关系数,那么根据你的帧如何修改,你将很难确定这种方法的好阈值,因为没有好的阈值。但是你没有清楚地说明你在第一种方法中做了什么。你是将初始帧设置为基础帧,然后将每个新帧与其进行比较吗?然后,如果'sim_index'低于'threshold',则将此新帧标记为基础帧。重复。这是你的方法吗? - mmgp
1个回答

4

第二种方法通常被认为是最简单的运动检测方法,如果你的视频中没有水流、摇晃的树或高度变化的光照条件,那么它将非常有效。

通常可以按如下方式实现:

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

你可以对运动帧进行阈值处理,然后计算非零值。但你也可以直接对运动帧中的元素进行求和,并进行阈值处理(务必使用浮点数)。针对此进行参数优化非常容易,只需要设置两个滑动条并进行调整即可。通常情况下 alpha 值在 [0.1; 0.3] 范围内。
最后,对整个帧进行操作可能有些过度了,你可以使用子采样版本来处理,结果会非常相似。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接