人脸识别的大体思路:
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的版本问题,在更新迭代后各种函数会出现相应修改。