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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SOC罗三炮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值