opencv 进行人脸识别

人脸识别的大体思路:

1.首先要检测出人脸的位置

2.对检测出来的人脸进行一系列的处理

3.通过模型来对人脸进行识别

4.输出结果

我的代码的大体思路:

1.首先是判断是否要进行录入人脸

2.通过加载模型对用摄像头实时拍摄的照片进行人脸匹配

(除此之外还需要自己训练一个模型来进行检测)

下面的代码是假设模型已经训练好了:

import cv2


def renlianluru ():
    count = 101  # 表示录入人脸的次数, 目前是录入 100 张来进行训练
    while True:
        # 读取视频帧
        ret, frame = video_capture.read()

        # 将原始图像转换为灰度图像
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        # 调用人脸识别模型识别人脸位置
        faces = faceCascade.detectMultiScale(
            gray,
            scaleFactor=1.1,
            minNeighbors=5,
            minSize=(100, 100)
        )
       
        # 为每个检测到的人脸画框
        for (x, y, w, h) in faces:
            cv2.rectangle(frame, (x, y), (x + w, y + w), (0, 255, 0), 2)
            cv2.putText(frame, "nihao", (x + 5, y - 5), font, 1, (0, 0, 255), 1)
            count = count + 1
         
        # 显示结果
        cv2.imshow('Video', frame)
       
        # 等待键盘输入Q退出
        if cv2.waitKey(1) & 0xFF == ord('q'):
            print("结束人脸录制")
            break
        elif count >= 200:
            print("录入人脸成功")
            break

    # 释放摄像头,关闭窗口
    video_capture.release()
    cv2.destroyAllWindows()

font = cv2.FONT_HERSHEY_SIMPLEX
# 看要不要去录入脸
luru = input("请问你要不要录入人脸(录入:输入 1; 不录: 输入 0;)")
if luru == '1':
    print("好的,下面进行人脸录入")
    # 加载人脸识别的模型
    faceCascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
    # 打开摄像头(可传入视频文件路径进行读取)
    video_capture = cv2.VideoCapture(0)
    # 提醒用户进行人脸录入
    face_id = input('User data input,Look at the camera and wait ...')
    renlianluru()
else:
    print("不录入人脸")

# 加载模型

recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('D:\\python\\project\\project 4 renlianppeimoxing\\trainer.yml')
print("模型导入成功")

# 加载级联分类器用于人脸检测
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

# 字体设置
font = cv2.FONT_HERSHEY_SIMPLEX

# 摄像头设置
cam = cv2.VideoCapture(0)
cam.set(6, cv2.VideoWriter.fourcc('M', 'J', 'P', 'G'))

# 人脸匹配的名称列表
names = ['lihaojun', 'songlu']

while True:
    ret, img = cam.read()

    # 图像灰度处理
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 人脸检测
    faces = face_cascade.detectMultiScale(
        gray,
        scaleFactor=1.2,
        minNeighbors=5,
        minSize=(100, 100)
    )

    # 遍历检测到的人脸
    for (x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
        idnum, confidence = recognizer.predict(gray[y:y + h, x:x + w])
        print("识别结果")
        if confidence < 80:
            idum = names[idnum]
            confidence = "{0}%".format(round(100 - confidence))
        else:
            idum = "unknown"
            confidence = "{0}%".format(round(100 - confidence))


        # 在图像上显示识别结果
        cv2.putText(img, str(idum), (x + 5, y - 5), font, 1, (0, 0, 255), 1)
        cv2.putText(img, str(confidence), (x + 5, y + h - 5), font, 1, (0, 0, 0), 1)

    # 显示图像和等待用户按键操作
    cv2.imshow('camera', img)
    if cv2.waitKey(1) & 0xFF == ord('m'):
        print("结束人脸录制")
        break

cam.release()
cv2.destroyAllWindows()

下面的代码是进行模型训练的代码:

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

path = 'D:\\python\\project\\project 3\\opencv_text'
recognizer = cv2.face.LBPHFaceRecognizer_create()
cascade_classifier = cv2.CascadeClassifier()

# 打印CascadeClassifier对象的文件路径
print(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

detector = cv2.CascadeClassifier("C:\\Users\\86181\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python310\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml")

def get_images_and_labels(path):
    image_paths = [os.path.join(path, f) for f in os.listdir(path)]
    face_samples = []
    ids = []

    for image_path in image_paths:
        img = Image.open(image_path).convert('L')
        img_np = np.array(img, 'uint8')
        if os.path.split(image_path)[-1].split(".")[-1] != 'jpg':
            continue

        id = os.path.split(image_path)[-1].split(".")[0]
        print(id)
        faces = detector.detectMultiScale(img_np)

        for (x, y, w, h) in faces:
            face_samples.append(img_np[y:y + h, x:x + w])
            ids.append(id)
    return face_samples, ids


faces, ids = get_images_and_labels(path)
label_mapping = {'1lihaojun': 0, '1songlu': 1}  # 根据实际情况创建映射字典
int_ids = [label_mapping[label] for label in ids]
print(int_ids)
recognizer.train(faces, np.array(int_ids))
print("训练结束")
recognizer.save('D:\\python\\project\\project 4 renlianppeimoxing\\trainer.yml')
print("保存完毕")

(解释一下:这个模型进行人脸训练的时候把数据分为俩个部分,第一个部分是保存人脸信息, 第二个部分是保存对应的你图片的人名的信息。 但是要注意一点,因为模型训练是需要的是俩个部分都要是数组,因此,我是把人名转换成为它在列表的位置。后面调用模型时,预测人脸是保存的就是对应的姓名在列表中的位置)

这里的代码是我通过别人的代码稍作修改的,如果你碰到了问题去找其他的人的意见去修改,还是会出现问题,如果出现函数没有找到,不存在的问题,那应该就是opencv的版本问题,在更新迭代后各种函数会出现相应修改。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值