python opencv3 背景分割 mog2 knn

git:https://github.com/linyi0604/Computer-Vision

使用mog2算法进行背景分割

 1 # coding:utf-8
 2 
 3 import cv2
 4 
 5 # 获取摄像头对象
 6 cap = cv2.VideoCapture(0)
 7 # 背景分割器对象
 8 mog = cv2.createBackgroundSubtractorMOG2()
 9 
10 while True:
11     ret, frame = cap.read()
12     fgmask = mog.apply(frame)
13     cv2.imshow("frame", fgmask)
14     if cv2.waitKey(5) & 0xff == ord("q"):
15         break
16 
17 cap.release()
18 cv2.destroyAllWindows()

 

使用knn进行背景分割 顺便检测运动物体

 1 # coding:utf-8
 2 
 3 import cv2
 4 
 5 # 获取摄像头
 6 camera = cv2.VideoCapture(0)
 7 # 获取背景分割器对象
 8 bs = cv2.createBackgroundSubtractorKNN(detectShadows=True)
 9 
10 while True:
11     # 读取帧
12     ret, frame = camera.read()
13     # 获取前景
14     fgmask = bs.apply(frame)
15     # 对前景二值化
16     th = cv2.threshold(fgmask.copy(), 244, 255, cv2.THRESH_BINARY)[1]
17     # 膨胀运算
18     dilated = cv2.dilate(th, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)), iterations=2)
19     # 检测轮廓
20     image, contours, hier = cv2.findContours(dilated, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
21     # 将轮廓画在原图像上
22     for c in contours:
23         x, y, w, h = cv2.boundingRect(c)
24         cv2.rectangle(frame, (x, y), (x+w, y+h), (2555, 255, 0), 2)
25     # 显示前景
26     cv2.imshow("fgmask", fgmask)
27     # 显示二值化
28     cv2.imshow("thresh", th)
29     # 显示带有轮廓的原图
30     cv2.imshow("detection", frame)
31     if cv2.waitKey(5) & 0xff == ord("q"):
32         break
33 
34 cv2.destroyAllWindows()
35 camera.release()

 

 

posted @ 2018-08-09 17:40  稀里糊涂林老冷  阅读(3562)  评论(0编辑  收藏  举报