Python 如何使用opencv检测帧之间是否存在运动,而不只是减去帧?

Python 如何使用opencv检测帧之间是否存在运动,而不只是减去帧?,python,c++,opencv,image-processing,Python,C++,Opencv,Image Processing,我有一个固定位置的摄像头,可以观察目标,我想检测是否有人走在目标前面。场景中的照明可以更改,因此,从前一帧减去新更改的帧将检测运动,即使实际没有发生运动。我曾想比较两帧之间的轮廓数量(通过在canny获得的二值边缘图像上使用FindOntours()获得,然后获得该图像的大小()),因为这里的一个大变化可能表示移动,同时对光线变化不太敏感,我是OpenCV的新手,到目前为止,我的实现还没有成功。有没有一种方法可以让它工作,或者我只需要减去帧。我不需要追踪那个人,只需要检测他们是否在现场。有几种方

我有一个固定位置的摄像头,可以观察目标,我想检测是否有人走在目标前面。场景中的照明可以更改,因此,从前一帧减去新更改的帧将检测运动,即使实际没有发生运动。我曾想比较两帧之间的轮廓数量(通过在canny获得的二值边缘图像上使用FindOntours()获得,然后获得该图像的大小()),因为这里的一个大变化可能表示移动,同时对光线变化不太敏感,我是OpenCV的新手,到目前为止,我的实现还没有成功。有没有一种方法可以让它工作,或者我只需要减去帧。我不需要追踪那个人,只需要检测他们是否在现场。

有几种方法可以做到这一点

首先想到的是对传入图像进行2D FFT。颜色不应该对FFT影响太大,但是移动、进入/退出帧的对象会影响FFT


第二种方法是使用SIFT或SURF生成图像中的特征列表,您可以将这些点插入到地图中,按照您喜欢的方式进行排序,然后在您拍摄的最后一张图像和当前图像之间进行设置。您还可以使用FLANN功能来比较生成的功能。

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

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

有几种“背景去除”方法

平均删除:在这一个中,你得到N帧的平均值,并将其视为BG。这很容易受到很多因素的影响,如光线变化、阴影、移动对象长时间停留在某个位置等

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

  • 增量主成分追踪(incremental Princy component pursuit):我记不清算法的全部内容,但基本思想是将每一帧转换为稀疏形式,然后从稀疏矩阵中提取运动对象

  • 光流:您可以在视频的时域中找到变化。例如,逐块比较frame2和frame1,并告知更改方向

  • 基于CNN的方法:我知道有很多,但我并没有真正遵循它们。你可能得做些调查。据我所知,它们往往比上述方法更好

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