《OpenCV 3计算机视觉——python语言实现(原书第2版)》
第八章目标跟踪
|______8.1检测移动的目标
本节只是对书中代码进行详细解读
#!/usr/bin/env python
#__*__coding=utf-8__*__
"""
利用侦差法检测背景
"""
import cv2
import numpy as np
#获取摄像头图像
camera = cv2.VideoCapture(0)
#获取常用的结构元素的形状 椭圆>>长轴为9,短轴为4
#参数介绍MORPH_RECT(矩形), MORPH_ELLIPSE(椭圆),MORPH_CROSS(十字形)
es = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(9,4))
#定义内核大小及元素
kernel = np.ones((5,5),np.uint8)
background = None
#进入视频流处理
while(True):
#获取图像
ret,frame = camera.read()
if background is None:
#背景灰度化
background = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
#背景高斯滤波
background = cv2.GaussianBlur(background,(21,21),0)
continue
#灰度化
gray_fram = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
#高斯模糊
gray_fram = cv2.GaussianBlur(gray_fram,(21,21),0)
#与背景做侦差(取差值得绝对值)
diff = cv2.absdiff(background,gray_fram)
#侦差结果二值化
diff = cv2.threshold(diff,25,255,cv2.THRESH_BINARY)[1]
#侦差结果膨胀处理
diff = cv2.dilate(diff,es,iterations=2)
#对侦差结果进行找轮廓
image,cnts,hierarchy = cv2.findContours(diff.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
#如果轮廓变化大,则画矩形,认为有变化
for c in cnts:
if cv2.contourArea(c) < 1500:
continue
(x,y,w,h) = cv2.boundingRect(c)
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)
cv2.imshow("contours",frame)
cv2.imshow("diff",diff)
if cv2.waitKey(100) & 0xff == ord("q"):
break
cv2.destroyAllWindows()
camera.release()