Python:使用cv2模块进行人脸识别Demo

简介:opencv的人脸检测的xml文件,这些文件可用于检测静止图像,视频和摄像头所得到图像中的人脸。业余AI相关学习人员,错误的地方请指正,轻喷。

案例的前提:Python环境、Opencv库,笔记本摄像头

实现步骤

1、调用开启摄像头,进行人脸录入。(单人场景可以考虑通过sanic编写一个接口实现远程访问进行截图保存)
2、对采集的人脸进行数据训练。
3、调用数据训练的模型算法结果,开启摄像头,编写识别逻辑。

案例源码:

input_face.py


import cv2.cv2 as cv2
# 思路:
# 1、开启摄像头
# 2、按{数目.名字.jpg}的形式保存到人脸目录


cap = cv2.VideoCapture(0)
num = 1

# 录入保存的英文名字。cv2.putText不支持中文,中文需要设置字体,暂不考虑,后续单独更新一篇。
name = "tom"

while True:
    ret_flag, v_show = cap.read()
    cv2.imshow("Capture", v_show)
    k = cv2.waitKey(1)
    if k == ord("s"):
        face_num = str(num) + "." + name
        cv2.imwrite(fr"D:\xxxxx\person_face\{face_num}.jpg", v_show)
        print("成功保存", str(num) + ".jpg")
        print("*" * 80)
        num += 1
    elif k == ord(" "):
        break

cap.release()  # 释放摄像头
cv2.destroyAllWindows()

单人sanic远程截图:参考sanic:通过API接口进行电脑截图或录像

data_training.py

import os
import cv2.cv2 as cv2
import numpy as np
from PIL import Image


def get_img_labels(path):
    faces_samples = []
    ids = []
    img_paths = [os.path.join(path, f) for f in os.listdir(path)]
    face_detector = cv2.CascadeClassifier(
        r"D:\xxxxxx\venv\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml")

    for img_path in img_paths:
        pil_img = Image.open(img_path).convert("L")
        img_numpy = np.array(pil_img, "uint8")

        faces = face_detector.detectMultiScale(img_numpy)
        id = int(os.path.split(img_path)[1].split(".")[0])
        for x, y, w, h in faces:
            ids.append(id)
            faces_samples.append(img_numpy[y:y + h, x:x + w])
    print(f"id:{id}")
    print(f"faces_samples:{faces_samples}")
    return faces_samples, ids


if __name__ == '__main__':
    path = r"D:\codes\ai2022\person_face"
    faces, ids = get_img_labels(path)
    recognizer = cv2.face.LBPHFaceRecognizer_create()
    recognizer.train(faces, np.array(ids))
    recognizer.write("TrainingDataSet.yml")

main.py

# coding=utf-8
import cv2.cv2 as cv2
import os

# 加载训练数据集文件
recogizer = cv2.face.LBPHFaceRecognizer_create()
recogizer.read('TrainingDataSet.yml')
names = []


def face_detect_demo(img):
    # 准备识别的视频,图片,摄像头等。
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转换为灰度
    face_detector = cv2.CascadeClassifier(
        r'D:\xxxxx\venv\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')
    face = face_detector.detectMultiScale(gray, 1.1, 3, cv2.CASCADE_SCALE_IMAGE, (50, 100), (300, 300))
    for x, y, w, h in face:
        cv2.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=2)
        cv2.circle(img, center=(x + w // 2, y + h // 2), radius=w // 2, color=(0, 255, 0), thickness=1)
        # 人脸识别
        print(f"names:{names}")
        ids, confidence = recogizer.predict(gray[y:y + h, x:x + w])
        print(f"confidence:{confidence}")
        if confidence > 70:
            cv2.putText(img, 'unKnow', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
        else:
            cv2.putText(img, str(names[ids - 1]), (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
    cv2.imshow('result', img)


def name():
    path = r'D:\xxxxx\person_face'
    imagePaths = [os.path.join(path, f) for f in os.listdir(path)]
    for imagePath in imagePaths:
        name = str(os.path.split(imagePath)[1].split('.', 2)[1])
        names.append(name)


cap = cv2.VideoCapture(0)
name()
while True:
    flag, frame = cap.read()
    if not flag:
        break
    face_detect_demo(frame)
    if ord(' ') == cv2.waitKey(10):
        break
cv2.destroyAllWindows()
cap.release() # 释放摄像头
print(names)

人脸录入保存的结果:保存的图像特征labels越多,执行的时间就越长,效果越好。一般建议多角度,多条件录入,例如侧脸,正脸,远近高低,光照,衣服颜色,背景,角度,俯视平视仰视。
Python:使用cv2模块进行人脸识别Demo_第1张图片

最终运行效果:

截取1

Python:使用cv2模块进行人脸识别Demo_第2张图片

截取2
Python:使用cv2模块进行人脸识别Demo_第3张图片

针对识别视频类型的类例的执行效果:

Python:使用cv2模块进行人脸识别Demo_第4张图片

Python:使用cv2模块进行人脸识别Demo_第5张图片
微信公众号:玩转测试开发
欢迎关注,共同进步,谢谢!

Python:使用cv2模块进行人脸识别Demo_第6张图片

你可能感兴趣的:(python,计算机视觉,opencv)