python基于opencv的人脸识别完整代码
时间: 2023-10-16 17:08:30 浏览: 43
以下是一个完整的基于OpenCV的人脸识别Python代码示例:
```python
import os
import cv2
import numpy as np
import pickle
# 设置训练数据集路径
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
image_dir = os.path.join(BASE_DIR, "images")
# 加载Haar级联分类器
faceCascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
# 初始化面部标签和训练数据集
current_id = 0
label_ids = {}
y_labels = []
x_train = []
# 遍历训练数据集中的每个人脸图像
for root, dirs, files in os.walk(image_dir):
for file in files:
if file.endswith("png") or file.endswith("jpg"):
path = os.path.join(root, file)
label = os.path.basename(root).replace(" ", "-").lower()
# 如果标签不存在,则创建新标签
if not label in label_ids:
label_ids[label] = current_id
current_id += 1
id_ = label_ids[label]
# 加载图像并将其转换为灰度图像
pil_image = cv2.imread(path)
gray = cv2.cvtColor(pil_image, cv2.COLOR_BGR2GRAY)
# 使用Haar级联分类器检测人脸
faces = faceCascade.detectMultiScale(gray, scaleFactor=1.5, minNeighbors=5)
# 对每个检测到的人脸进行标记并将其添加到训练数据集中
for (x, y, w, h) in faces:
roi_gray = gray[y:y+h, x:x+w]
x_train.append(roi_gray)
y_labels.append(id_)
# 使用局部二值模式(LBP)算法对训练数据集进行特征提取和训练
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.train(x_train, np.array(y_labels))
# 将标签映射到标签ID
labels = {v:k for k,v in label_ids.items()}
# 将标签保存到文件
with open("labels.pickle", 'wb') as f:
pickle.dump(label_ids, f)
# 将训练数据集保存到文件
recognizer.save("trainer.yml")
# 打开摄像头并进行实时人脸识别
cap = cv2.VideoCapture(0)
while True:
# 读取视频帧
ret, frame = cap.read()
# 转换为灰度图像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 使用Haar级联分类器检测人脸
faces = faceCascade.detectMultiScale(gray, scaleFactor=1.5, minNeighbors=5)
# 对每个检测到的人脸进行识别
for (x, y, w, h) in faces:
roi_gray = gray[y:y+h, x:x+w]
id_, confidence = recognizer.predict(roi_gray)
if confidence >= 45 and confidence <= 85:
font = cv2.FONT_HERSHEY_SIMPLEX
name = labels[id_]
cv2.putText(frame, name, (x,y), font, 1, (255,255,255), 2, cv2.LINE_AA)
# 画出人脸检测框
color = (255, 0, 0)
stroke = 2
end_cord_x = x + w
end_cord_y = y + h
cv2.rectangle(frame, (x, y), (end_cord_x, end_cord_y), color, stroke)
# 显示视频帧
cv2.imshow('frame',frame)
if cv2.waitKey(20) & 0xFF == ord('q'):
break
# 释放摄像头资源
cap.release()
cv2.destroyAllWindows()
```
这个代码示例中,我们首先遍历训练数据集中的所有图像,并使用Haar级联分类器检测人脸。然后,我们使用局部二值模式(LBP)算法对训练数据集进行特征提取和训练,并将标签和训练数据集保存到文件。最后,我们打开摄像头进行实时人脸识别。如果置信度(confidence)在45到85之间,就将人脸识别结果绘制在视频帧上。