写一个基于Python_opencv人脸录入、识别系统
时间: 2024-01-16 22:03:20 浏览: 90
基于python和opencv开发的人脸识别检测考勤管理可视化系统源码)+模型文件(可作课设毕设).zip
好的,我可以为您提供一个基于 Python 和 OpenCV 的人脸录入和识别系统。以下是基本的步骤:
1. 安装 OpenCV 库和其他依赖库,例如 numpy 和 argparse。
2. 准备训练数据集。这里我们可以使用已经标记好的数据集,例如 LFW 数据集,或者自己标记一些人脸数据集。
3. 训练人脸识别模型。我们可以使用 OpenCV 自带的人脸识别算法 LBPH(Local Binary Patterns Histograms)或者使用其他深度学习算法,例如基于卷积神经网络(CNN)的人脸识别模型。
4. 实现人脸录入功能。这里我们可以使用 OpenCV 的人脸检测算法来检测人脸,并使用摄像头拍摄人脸图像,然后将图像保存到本地。
5. 实现人脸识别功能。我们可以使用 OpenCV 的人脸识别算法来识别人脸,并将人脸与已知的人脸数据进行比对,从而确定识别结果。
下面是一些代码参考:
```python
import cv2
import numpy as np
import argparse
# 训练模型
def train_model(training_data):
# 加载数据
faces = []
labels = []
for label, folder in enumerate(training_data):
for image_path in folder.glob("*.jpg"):
image = cv2.imread(str(image_path), cv2.IMREAD_GRAYSCALE)
faces.append(image)
labels.append(label)
# 训练模型
face_recognizer = cv2.face.LBPHFaceRecognizer_create()
face_recognizer.train(faces, np.array(labels))
return face_recognizer
# 检测人脸
def detect_face(image, face_cascade):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
if len(faces) == 0:
return None, None
(x, y, w, h) = faces[0]
return gray[y:y+w, x:x+h], faces[0]
# 识别人脸
def recognize_face(image, face_recognizer, face_cascade):
face, rect = detect_face(image, face_cascade)
if face is None:
return None
label, confidence = face_recognizer.predict(face)
return label, confidence
# 录入人脸
def add_face(image, face_cascade, output_folder, label):
face, rect = detect_face(image, face_cascade)
if face is None:
return False
output_path = output_folder / f"{label}_{len(list(output_folder.glob('*.jpg'))) + 1}.jpg"
cv2.imwrite(str(output_path), face)
return True
# 主函数
def main():
parser = argparse.ArgumentParser(description="Face Recognition System")
parser.add_argument("--train", action="store_true", help="Train the face recognition model")
parser.add_argument("--input", type=str, help="Input image or video path")
parser.add_argument("--output", type=str, help="Output image or video path")
parser.add_argument("--add", type=str, help="Add a new face to the dataset")
parser.add_argument("--label", type=str, help="Label of the new face")
args = parser.parse_args()
if args.train:
# 训练模型
training_data = [Path("data/face_recognition/person1"), Path("data/face_recognition/person2")]
face_recognizer = train_model(training_data)
face_recognizer.save("data/face_recognition/model.xml")
elif args.add:
# 录入新人脸
image = cv2.imread(args.add)
face_cascade = cv2.CascadeClassifier("data/haarcascade_frontalface_default.xml")
output_folder = Path("data/face_recognition/person3")
add_face(image, face_cascade, output_folder, args.label)
else:
# 识别人脸
face_recognizer = cv2.face.LBPHFaceRecognizer_create()
face_recognizer.read("data/face_recognition/model.xml")
face_cascade = cv2.CascadeClassifier("data/haarcascade_frontalface_default.xml")
if args.input:
# 处理图片
image = cv2.imread(args.input)
label, confidence = recognize_face(image, face_recognizer, face_cascade)
print(f"Recognized label: {label}, confidence: {confidence}")
if args.output:
cv2.imwrite(args.output, image)
else:
# 处理视频
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
label, confidence = recognize_face(frame, face_recognizer, face_cascade)
print(f"Recognized label: {label}, confidence: {confidence}")
if args.output:
cv2.imwrite(args.output, frame)
cv2.imshow("Face Recognition", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
main()
```
您可以根据需要调整代码并添加更多功能。
阅读全文