用Python实现简单的人脸识别功能步骤详解
本攻略将介绍如何使用Python实现简单的人脸识别功能,并提供一些常见问题的解决方案。
1. 安装OpenCV
首先,我们需要安装OpenCV。可以使用以下命令:
pip install opencv-python
2. 收集人脸数据
接下来,我们需要收集人脸数据。可以使用以下步骤:
- 打开摄像头
- 按下“s”键开始收集人脸数据
- 按下“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. 训练人脸识别模型
接下来,我们需要训练人脸识别模型。可以使用以下步骤:
- 加载人脸数据
- 训练人脸识别模型
- 保存人脸识别模型
以下是一个示例代码,用于训练人脸识别模型:
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')
在上面的代码中,我们首先导入cv2
、numpy
和Image
模块。使用os.path.join()
函数获取图像路径。使用Image.open()
函数打开图像。使用np.array()
函数将图像转换为NumPy数组。使用os.path.split()
函数获取图像文件名。使用detector.detectMultiScale()
函数检测人脸。使用recognizer.train()
函数训练人脸识别模型。使用recognizer.write()
函数保存人脸识别模型。
4. 进行人脸识别
最后,我们可以使用训练好的人脸识别模型进行人脸识别。可以使用以下步骤:
- 加载人脸识别模型
- 打开摄像头
- 进行人脸识别
以下是一个示例代码,用于进行人脸识别:
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()
在上面的代码中,我们首先导入cv2
和numpy
模块。使用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实现简单的人脸识别功能步骤详解的攻略,以及两个示例说明。希望对你有所帮助!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用Python实现简单的人脸识别功能步骤详解 - Python技术站