使用 OpenCV 进行运动检测
Posted
技术标签:
【中文标题】使用 OpenCV 进行运动检测【英文标题】:Motion detection using OpenCV 【发布时间】:2012-12-08 08:36:18 【问题描述】:我看到与 opencv 运动检测相关的查询,但我的要求要简单得多,所以我再次问这个问题。 我想分析视频帧,看看帧中是否发生了变化。帧中发生的任何类型的运动都已被识别。我只想在有事情发生时得到通知。我不需要跟踪/绘制轮廓。
尝试过:
1) 使用 OpenCV (TM_CCORR_NORMED) 进行模板匹配。
我使用 cvMinMaxLoc & 得到相似度指数
if( sim_index > threshold )
"Nothing chnged"
else
"Changed
面临的问题:
我找不到决定如何设置阈值的方法。 false match 和 perfect 的值非常接近。
2) 方法2 a) 使运行平均 b) 取当前帧与移动平均之间的绝对差值。 c) 阈值化并使其二进制 d) 计算非零值的数量 再次陷入如何对其进行阈值处理,因为即使对于非常相似的帧,我也会得到大量非零值。
请告诉我应该采取什么方法。我是否使用上述两种方法朝着正确的方向前进,或者是否有一种简单的方法可以适用于所有最通用的场景。
【问题讨论】:
如果 TM_CCORR_NORMED 等价于 Pearson 相关系数,那么根据修改帧的方式,您将很难确定此方法的良好阈值,因为没有好的阈值。但是你没有清楚地说明你在第一种方法中做了什么。您是否将初始帧设置为基本帧,然后将每个新帧与其进行比较?然后,如果sim_index
低于threshold
,则将此新帧标记为基础帧。重复。那是你的方法吗?
【参考方案1】:
方法 2 通常被认为是最简单的运动检测方法,如果您的视频中没有水、摇摆的树木或变化很大的光照条件,则该方法非常有效。 通常你是这样实现的:
motion_frame=abs(newframe-running_avg);
running_avg=(1-alpha)*running_avg+alpha*newframe;
您可以根据需要设置motion_frame 阈值,然后计算非零值。但是您也可以将motion_frame 的元素和阈值相加(确保使用浮点数)。为此优化参数非常简单,只需制作两个轨迹栏并使用它。通常 alpha 约为 [0.1; 0.3]。
最后,在整个帧上这样做可能有点过头了,你可以只使用二次采样版本,结果会非常相似。
【讨论】:
以上是关于使用 OpenCV 进行运动检测的主要内容,如果未能解决你的问题,请参考以下文章
调试一种在 C++ 中使用 OpenCV 从视频中寻找运动平均帧以进行运动检测的方法