python使用opencv打开摄像头实现人脸识别和移动检测并将检测到的人脸保存
python使用opencv打开摄像头实现人脸识别和移动检测并将检测到的人脸保存,
代码如下:
import cv2
import time
'''import numpy as np'''
'''===================================================================================='''
#人脸识别:
def getface(image):
# 创建 classifier
clf = cv2.CascadeClassifier(r'D:\python\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 识别面部
faces = clf.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=5,
minSize=(60, 60),
flags=cv2.CASCADE_SCALE_IMAGE
)
count = 1
if len(faces):
for (x, y, w, h) in faces:
# 设置人脸宽度大于60像素,去除较小的人脸
if w>=60 and h>=60:
# 以时间戳和读取的排序作为文件名称
listStr = [str(int(time.time())), str(count)]
fileName = ''.join(listStr)
cv2.imwrite('%s.jpg' % fileName, image[y:y+h,x:x+w])
count += 1
return len(faces)
'''===================================================================================='''
# 运动检测部分,把前一帧和后一帧放入
def move(pre_frame,gray_lwpCV):
img_delta = cv2.absdiff(pre_frame, gray_lwpCV)
thresh = cv2.threshold(img_delta, 25, 255, cv2.THRESH_BINARY)[1]
thresh = cv2.dilate(thresh, None, iterations=2)#腐蚀膨胀
contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for c in contours: #contours为图像相减后的轮廓
if cv2.contourArea(c) < 1000: # 设置敏感度
continue
else:
print("有东西在动。。。")
return 1
break
'''===================================================================================='''
#参数设置
a=1
b='.jpg'
fps = 5 # 帧率
pre_frame = None # 总是取视频流前一帧做为背景相对下一帧进行比较
i = 0
flag =0
flag=int(input("请输入监控模式:(0:普通监测 1:人脸检测)"))
# 参数0表示第一个摄像头
camera = cv2.VideoCapture(0)
# 判断视频是否打开
if (camera.isOpened()):
print('摄像头已打开')
else:
print('摄像头未打开')
# 无限循环读取视频流
while True:
grabbed, frame_lwpCV = camera.read() # 读取视频流
gray_lwpCV = cv2.cvtColor(frame_lwpCV, cv2.COLOR_BGR2GRAY) # 转灰度图
#判断是否读到图像信息
if not grabbed:
print('未读到图像信息')
break
face_NUM=getface(frame_lwpCV)
cv2.imshow('detecting', frame_lwpCV)
#预处理
gray_lwpCV = cv2.resize(gray_lwpCV, (500, 500))
gray_lwpCV = cv2.GaussianBlur(gray_lwpCV, (21, 21), 0)
#逻辑处理
if pre_frame is None:
pre_frame = gray_lwpCV
else:
#把前一帧和后一帧放入move()中对比
ccc= move(pre_frame,gray_lwpCV)
if ccc==1 and flag==1:
print("找到 {0} 张脸!".format(face_NUM))
name=str(a)+b
#如果face_NUM>=1就保存图像
if(face_NUM>=1):
cv2.imwrite(name,frame_lwpCV)
a=a+1
elif ccc==1:
name=str(a)+b
cv2.imwrite(name,frame_lwpCV)
a=a+1
pre_frame = gray_lwpCV
key = cv2.waitKey(1) & 0xFF
# 按'q'健退出循环
if key == ord('q'):
break
# 释放摄像头和窗口
camera.release()
cv2.destroyAllWindows()
还没有评论,来说两句吧...