算法参考:https://docs.opencv.org/3.1.0/db/d5c/tutorial_py_bg_subtraction.html

移动侦测

移动侦测方法,通过摄像头按照不同帧率采集得到的图像会被CPU按照一定算法进行计算和比较,当画面有变化时,如有人走过,镜头被移动,计算比较结果得出的数字会超过阈值并指示系统能自动作出相应的处理。
移动侦测允许在指定区域能识别图像的变化,检测运动物体的存在并避免由光线变化带来的干扰。但是如何从实时的序列图像中将变化区域从背景图像中提取出来,还要考虑运动区域的有效分割对于目标分类、跟踪等后期处理是非常重要的,因为以后的处理过程仅仅考虑图像中对应于运动区域的像素。然而,由于背景图像的动态变化,如天气、光照、影子及混乱干扰等的影响,使得运动检测成为一项相当困难的工作。

背景减除

背景减除法(Background Subtraction )是目前运动检测中最常用的一种方法,它是利用当前图像与背景图像的差分来检测出运动区域的一种技术。它一般能够提供最完全的特征数据,但对于动态场景的变化,如光照和外来无关事件的干扰等特别敏感。最简单的背景模型是时间平均图像,大部分的研究人员目前都致力于开发不同的背景模型,以期减少动态场景变化对于运动分割的影响。

opencv

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

cv2.BackgroundSubtractorMOG2库

Zivkovic 提出的《Improved adaptive Gaussian mixture model for background subtraction》和《Efficient Adaptive Density Estimation per Image Pixel for the Task of Background Subtraction》。通过cv2.BackgroundSubtractorMOG2使用。

开始

安装 opencv库

pip3 install opencv-python

直接使用cv2.BackgroundSubtractorMOG2

import cv2

cap = cv2.VideoCapture("/Users/apple/Desktop/奥巴马演讲在这里插入图片描述.mp4")
fgbg = cv2.createBackgroundSubtractorMOG2()

while (1):
    ret, frame = cap.read()

    image = fgbg.apply(frame)

    cv2.imshow('result', image)

    k = cv2.waitKey(50) & 0xff
    if k == 27:
        break

cap.release()
cv2.destroyAllWindows()

效果图:

opencv实现游戏自动寻路 opencv移动侦测_背景图


可以看到有很多的噪点,下面开始降噪处理

均值滤波降噪

import cv2
import numpy
import random

cap = cv2.VideoCapture("/Users/apple/Desktop/奥巴马演讲.mp4")
fgbg = cv2.createBackgroundSubtractorMOG2()

while (1):
    ret, frame = cap.read()

    for j in range(2): #对原视频进行滤波降噪2次(个人实验)
        for i in range(10000):
            height = frame.shape[0] - 1
            width = frame.shape[1] - 1
            a = random.randint(0, height)
            b = random.randint(0, width)
            frame[a, b] = 255

        frame = cv2.medianBlur(frame, 3)

    image = fgbg.apply(frame)

    for j in range(5): #对背景减除后的视频滤波降噪5次(个人实验)
        for i in range(10000):
            height = image.shape[0] - 1
            width = image.shape[1] - 1
            a = random.randint(0, height)
            b = random.randint(0, width)
            image[a, b] = 255

        image = cv2.medianBlur(image, 3)

    white = 0
    gray = 0

    for row in range(height+1):
        for col in range(width+1):
            if image[row, col] == 255:
                white = white + 1
            if image[row, col] == 127:
                gray = gray + 1

    print("white :",white)
    print("gray :",gray)
    cv2.imshow('result', image)
    k = cv2.waitKey(50) & 0xff
    if k == 27:
        break

cap.release()
cv2.destroyAllWindows()

效果图:

opencv实现游戏自动寻路 opencv移动侦测_ide_02


效果比原来有提高(可能选的例子不是太好,感兴趣的话可以选一些固定摄像头的道路监控视频)