关键词

用Python实现简单的人脸识别功能步骤详解

用Python实现简单的人脸识别功能步骤详解

本攻略将介绍如何使用Python实现简单的人脸识别功能,并提供一些常见问题的解决方案。

1. 安装OpenCV

首先,我们需要安装OpenCV。可以使用以下命令:

pip install opencv-python

2. 收集人脸数据

接下来,我们需要收集人脸数据。可以使用以下步骤:

  1. 打开摄像头
  2. 按下“s”键开始收集人脸数据
  3. 按下“q”键停止收集人脸数据

以下是一个示例代码,用于收集人脸数据:

import cv2

# 打开摄像头
cap = cv2.VideoCapture(0)

# 收集人脸数据
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
face_id = input('\n enter user id end press <return> ==>  ')

count = 0
while True:
    ret, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    for (x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
        count += 1
        cv2.imwrite("dataset/User." + str(face_id) + '.' + str(count) + ".jpg", gray[y:y + h, x:x + w])
        cv2.imshow('image', img)
    k = cv2.waitKey(100) & 0xff
    if k == 27:
        break
    elif count >= 30:
        break

# 关闭摄像头
cap.release()
cv2.destroyAllWindows()

在上面的代码中,我们首先导入cv2模块。使用cv2.VideoCapture()函数打开摄像头。使用cv2.CascadeClassifier()函数加载人脸检测器。使用input()函数获取用户ID。使用cv2.cvtColor()函数将图像从BGR格式转换为灰度格式。使用face_cascade.detectMultiScale()函数检测人脸。使用cv2.rectangle()函数绘制人脸矩形框。使用cv2.imwrite()函数保存人脸图像。使用cv2.imshow()函数显示图像。使用cv2.waitKey()函数等待按键。使用cap.release()函数关闭摄像头。使用cv2.destroyAllWindows()函数关闭所有窗口。

3. 训练人脸识别模型

接下来,我们需要训练人脸识别模型。可以使用以下步骤:

  1. 加载人脸数据
  2. 训练人脸识别模型
  3. 保存人脸识别模型

以下是一个示例代码,用于训练人脸识别模型:

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

# 加载人脸数据
path = 'dataset'
recognizer = cv2.face.LBPHFaceRecognizer_create()
detector = cv2.CascadeClassifier("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:
        pil_image = Image.open(image_path).convert('L')
        image_np = np.array(pil_image, 'uint8')
        id = int(os.path.split(image_path)[-1].split(".")[1])
        faces = detector.detectMultiScale(image_np)
        for (x, y, w, h) in faces:
            face_samples.append(image_np[y:y + h, x:x + w])
            ids.append(id)
    return face_samples, ids

faces, ids = get_images_and_labels(path)

# 训练人脸识别模型
recognizer.train(faces, np.array(ids))

# 保存人脸识别模型
recognizer.write('trainer.yml')

在上面的代码中,我们首先导入cv2numpyImage模块。使用os.path.join()函数获取图像路径。使用Image.open()函数打开图像。使用np.array()函数将图像转换为NumPy数组。使用os.path.split()函数获取图像文件名。使用detector.detectMultiScale()函数检测人脸。使用recognizer.train()函数训练人脸识别模型。使用recognizer.write()函数保存人脸识别模型。

4. 进行人脸识别

最后,我们可以使用训练好的人脸识别模型进行人脸识别。可以使用以下步骤:

  1. 加载人脸识别模型
  2. 打开摄像头
  3. 进行人脸识别

以下是一个示例代码,用于进行人脸识别:

import cv2
import numpy as np

# 加载人脸识别模型
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer.yml')
cascadePath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath)

# 打开摄像头
cap = cv2.VideoCapture(0)

# 进行人脸识别
font = cv2.FONT_HERSHEY_SIMPLEX
while True:
    ret, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = faceCascade.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)
        id, confidence = recognizer.predict(gray[y:y + h, x:x + w])
        if confidence < 100:
            id = "User." + str(id)
            confidence = "  {0}%".format(round(100 - confidence))
        else:
            id = "unknown"
            confidence = "  {0}%".format(round(100 - confidence))
        cv2.putText(img, str(id), (x + 5, y - 5), font, 1, (255, 255, 255), 2)
        cv2.putText(img, str(confidence), (x + 5, y + h - 5), font, 1, (255, 255, 0), 1)
    cv2.imshow('camera', img)
    k = cv2.waitKey(10) & 0xff
    if k == 27:
        break

# 关闭摄像头
cap.release()
cv2.destroyAllWindows()

在上面的代码中,我们首先导入cv2numpy模块。使用recognizer.read()函数加载人脸识别模型。使用cv2.CascadeClassifier()函数加载人脸检测器。使用cv2.VideoCapture()函数打开摄像头。使用faceCascade.detectMultiScale()函数检测人脸。使用recognizer.predict()函数进行人脸识别。使用cv2.rectangle()函数绘制人脸矩形框。使用cv2.putText()函数绘制人脸ID和置信度。使用cv2.imshow()函数显示图像。使用cv2.waitKey()函数等待按键。使用cap.release()函数关闭摄像头。使用cv2.destroyAllWindows()函数关闭所有窗口。

5. 常见解决方案

5.1 运行代码时出现“ModuleNotFoundError: No module named 'cv2'”错误

这个错误通常是由于没有正确安装OpenCV导致的。可以尝试使用以下命令重新安装OpenCV:

pip uninstall opencv-python
pip install opencv-python

5.2 运行代码时出现“cv2.error: OpenCV(4.5.2) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-wz5z5z5z\opencv\modules\core\src\persistence.cpp:719: error: (-49:Unknown error code -49) Input file is empty in function 'cv::findFileByName'”错误

这个错误通常是由于没有正确加载人脸检测器导致的。可以尝试使用以下命令重新加载人脸检测器:

faceCascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

这是用Python实现简单的人脸识别功能步骤详解的攻略,以及两个示例说明。希望对你有所帮助!

本文链接:http://task.lmcjl.com/news/16830.html

展开阅读全文