背景消除Background Subtraction

本节我们主要来学习背景消除技术来提取运动中的物体. 它在视频分析中有这很广泛的运用场景.首先我们可以使用背景消除,提取出运动的物体,然后对运动的物体仅一部分分析. 例如我们可以将这一技术运用在统计车流人流,用于安防监控等.

我们所采用的背景消除算法是基于高斯混合分布来进行前景和背景的分割

示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import cv2 as cv

capture = cv.VideoCapture()
filename="../img/vtest.avi"
capture.open(filename)

flag = capture.isOpened();
print(flag)
frame = None;
mogMask = None
# 初始化BS模型
mog2 = cv.createBackgroundSubtractorMOG2(detectShadows=False)
flag ,frame = capture.read()
# 形态学变换去掉噪声
kernel = cv.getStructuringElement(cv.MORPH_RECT,(3,3))

while flag:
    flag ,frame = capture.read()
    if not flag:
        break
    cv.imshow("frame",frame);
    mogMask = mog2.apply(frame)

    thresh ,mogMask = cv.threshold(mogMask,120,255,cv.THRESH_BINARY)

    mogMask = cv.morphologyEx(mogMask,cv.MORPH_OPEN,kernel);

    contours,hirechy = cv.findContours(mogMask,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)

    for i,contour in enumerate(contours):
        area = cv.contourArea(contour)
        if area > 500:
            #cv.drawContours(frame,contours,i,(255,255,0),1,cv.LINE_AA);
            rect = cv.boundingRect(contour)
            print(rect)
            cv.rectangle(frame,(rect[0],rect[1]),(rect[0]+rect[2],rect[1]+rect[3]),(255,0,0),2)
    cv.imshow("frame",frame)
    cv.imshow("mog2",mogMask)
    key = cv.waitKey(100)
    if key == 27 :
        break

capture.release();
cv.destroyAllWindows()