opencv 人脸识别,并抓拍

举报
yd_284485090 发表于 2023/10/29 15:21:01 2023/10/29
【摘要】 opencv 人脸识别,并抓拍 代码

# -*- coding: utf-8 -*-
import cv2
import imutils
from crop_img import crop_and_save_image
import datetime
# 加载摄像头
cap = cv2.VideoCapture(0)
# 创建人脸检测器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

# 初始化人数计数器
num_people = 0  # 画面中人的数量
init_people = 0  #
all_people = 0   # 整个视频中出现的人的数量
i = datetime.datetime.now()   # 现在的时间
i_pre = i.second-4    # 避免重复检测的参照时间
while True:
    # 读取摄像头数据
    ret, frame = cap.read()
    # 调整图像大小
    frame = imutils.resize(frame, width=500)
    # 转换为灰度图像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 检测人脸
    faces = face_cascade.detectMultiScale(gray, 1.3, 3)
    i = datetime.datetime.now()

    # 绘制人脸矩形框
    for (x, y, w, h) in faces:
        # 当画面中的检测到的人脸有变化时才进行抓拍人脸
        if init_people != len(faces):
            # print("second*********:", i.second, i_pre)
            # 拍判断画面中人脸数变化是否大于2秒,若大于进行新的抓拍,否则则认为为检测抖动不抓拍
            if abs(i.second - i_pre) % 60 > 2:
                # print("second:", i.second, i_pre)
                # 总人数加1
                all_people += 1
                # print("faces:", len(faces))
                # print("hhhhhhhhhhhh")
                # 进行抓拍人脸
                cropped_image = crop_and_save_image(frame, int(x*0.9), int(y*0.9), int(w*1.4), int(h*1.4))  # 裁剪人脸
            else:
                # 校验画面人数
                init_people = len(faces)
        # 绘制人脸检测框
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
    # 当 faces中的人脸序列全部检测完,才进行更新init_people与i_pre
    # 更新重复检测时间,校验画面人数
    if len(faces) != 0:
        i_pre = datetime.datetime.now().second  # 获取当前的时间
        init_people = len(faces)
    if len(faces) == 0:
        # i_pre = datetime.datetime.now().second
        init_people = 0
    # 更新人数计数器
    num_people = len(faces)

    # 在图像上显示人数
    cv2.putText(frame, "Number of People: {}".format(num_people), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255),
                2)

    # 显示图像
    cv2.imshow('frame', frame)

    # 按下q键退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
print(all_people)
# 释放摄像头并关闭窗口
cap.release()

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。