我看到了与opencv运动检测有关的查询,但是我的要求要简单得多,所以我再次询问该问题。

我想分析视频帧,看看帧中是否有变化。可以识别出框架中发生的任何类型的运动。如果发生任何事情,我只想得到通知。我不需要跟踪/绘制轮廓。

尝试:

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

我使用cvMinMaxLoc获得相似性指数

if( sim_index > threshold )

"Nothing chnged"

else

"Changed

面临的问题:

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

2)方法2

a)使运行平均值

b)取当前帧和移动平均值之间的绝对差。

c)阈值并将其设为二进制

d)计算非零值的数量

再次困扰于如何对其进行阈值处理,因为即使对于非常相似的帧,我也会得到大量的非零值。

请给我建议我应该采取什么方法。我是用上述两种方法朝着正确的方向走,还是有一种简单的方法可以在所有大多数通用场景中使用。

如果TM_CCORR_NORMED等效于Pearson相关系数,则根据修改帧的方式,您将很难为该方法确定合适的阈值,因为没有合适的阈值。 但是您没有明确说出您在第一种方法中所做的事情。 您是否将初始框架设置为基础框架,然后将每个新框架都与之进行比较? 然后,如果sim_index低于threshold,则将此新帧标记为基础帧。 重复。 那是你的方法吗?

方法2通常被认为是最简单的运动检测方法,如果视频中没有水,没有树木摇曳或光照条件变化很大,则方法2非常有效。

通常,您可以这样实现它:

motion_frame=abs(newframe-running_avg);

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

您可以根据需要对motion_frame设置阈值,然后计算非零值。 但是,您也可以将motion_frame的元素和阈值相加(确保使用浮点数)。 为此,优化参数非常容易,只需制作两个跟踪栏并进行操作即可。 通常alpha约为[0.1; 0.3]。

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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐