首页 > 解决方案 > 如何在不简单地减去帧的情况下使用 opencv 检测帧之间是否存在运动?

问题描述

我有一个固定位置的摄像头正在看着一个目标,我想检测是否有人走在目标前面。场景中的照明可以改变,因此从前一帧中减去新改变的帧将因此检测到运动,即使实际上没有发生任何运动。我曾考虑比较两帧之间的轮廓数量(通过在使用 canny 获得的二进制边缘图像上使用 findContours() 获得,然后获取它的 size()),因为这里的一个大变化可以表示运动,同时也不太敏感对于照明变化,我对 OpenCV 还很陌生,到目前为止我的实现还没有成功。有没有办法可以完成这项工作,或者我只需要减去帧。我不需要跟踪这个人,只需检测他们是否在场景中。

标签: pythonc++opencvimage-processing

解决方案


我有点生疏,但有多种方法可以做到这一点。

SIFT 和 SURF 是非常昂贵的操作,所以我认为您不会想要使用它们。

有几种“背景去除”方法。

  1. 平均去除:在这个中你得到 N 帧的平均值,并将其视为 BG。这很容易受到很多事情的影响,光线变化、阴影、移动物体长时间停留在一个位置等。

  2. 高斯混合模型:比 1 高级一点。仍然容易受到很多事情的影响。

  3. IncPCP(增量主成分追踪):我不完全记得算法,但基本思想是将每一帧转换为稀疏形式,然后从稀疏矩阵中提取运动对象。

  4. 光流:您会发现视频时域的变化。例如,您将 frame2 与 frame1 逐块进行比较,并告知变化的方向。

  5. 基于 CNN 的方法:我知道有很多方法,但我并没有真正关注它们。你可能需要做一些研究。据我所知,它们通常比上述方法更好。

请注意,对于@30Fps,您的代码应该在每帧 33 毫秒内完成,因此它可能是实时的。您可以找到许多可用于此任务的代码。


推荐阅读