OpenCV 3 计算机视觉 Python语言实现 8.2 背景分割器:KNN\MOG2和GMG
介绍BackgroundSubtractor类:
代码1:
#coding=gbk import numpy as np import cv2 cap = cv2.VideoCapture(r"G:\Python_work\detect\5.mp4") mog = cv2.createBackgroundSubtractorMOG2() while(1): ret, frame = cap.read() fgmask = mog.apply(frame) cv2.imshow('frame', fgmask) k = cv2.waitKey(30) & 0xff if k == 27: break cap.release() cv2.destroyAllWindows()
实现效果如下:
应用BackgroundSubtractorKNN实现运动检测的例子:
代码2: #coding=gbk import cv2 import numpy as np bs = cv2.createBackgroundSubtractorKNN(detectShadows=True) camera = cv2.VideoCapture(r"G:\Python_work\detect\video.mp4") while True: ret, frame = camera.read() fgmask = bs.apply(frame) <if fgmask is None: break img3=fgmask.copy()> #个人追加的代码段,消除内部循环 th = cv2.threshold(img3, 244, 255, cv2.THRESH_BINARY)[1] dilated = cv2.dilate(th, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)), iterations=2) image, contours, hier = cv2.findContours(dilated, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for c in contours: if cv2.contourArea(c) > 1600: (x, y, w, h) = cv2.boundingRect(c) cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 255, 0), 2) cv2.imshow("mog", fgmask) cv2.imshow("thresh", th) cv2.imshow("detection", frame) k = cv2.waitKey(30) & 0xff if k == 27: break camera.release() cv2.destroyAllWindows()
在运行课本附带的代码时,提示错误:cv2.error: OpenCV(3.4.1) D:\Build\OpenCV\opencv-3.4.1\modules\highgui\src\window.cpp:364: error: (-215) size.width>0 && size.height>0 in function cv::imshow,通过追加如<>中的代码段,可消除错误。
实现效果如下: