点击蓝字 关注我们
一、准备工作
1.导入项目所需要的库
根据图1.1-图1.4的步骤进行操作。

图1.1 点击“文件”

图1.2 点击“设置”

图1.3 点击“Python Interpreter”

图1.4 添加的库
二、信息录入
1.程序介绍
此步骤的主要作用,是将你想识别的人脸的图片保存到一个新建文件夹中,并以此人姓名命名图片,为下一步的数据训练作准备。
这里我调用了人脸检测库,当检测到人脸就将图片保存,一共保存100张(可以根据需要自行调节),达到100张后程序自动结束。
2.代码展示及解读
import cv2 as cv # 导入模块cap = cv.VideoCapture(0) # 读取摄像头flag = 1num = 1while(cap.isOpened()): # 检查是否在开启状态ret_flag, Vshow = cap.read() # 得到每帧图像gray = cv.cvtColor(Vshow, cv.COLOR_BGR2GRAY) # 灰度图转化face_detect = cv.CascadeClassifier("D:/PYcharmProject/Hello World/venv/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml")face = face_detect.detectMultiScale(gray, 1.2, 5) # 调用人脸检测库for (x, y, w, h) in face: # 检测人脸,如果检测到则将图片保存到“D:/PYcharmProject/face shibie/venv/jm/”目录下cv.rectangle(Vshow, (x, y), (x + w, y + h), color=(0, 0, 225), thickness=2)cv.imwrite("D:/PYcharmProject/face shibie/venv/jm/" + str(num) + ".1001" + ".Tang" + ".jpg", Vshow)print('成功保存图片' + str(num) + '.jpg')num += 1if num == 101: # 判断保存图片到达100张跳出循环breakcv.imshow('Capture_Test', Vshow) # 显示图像k = cv.waitKey(1) & 0xFF # 按键判断if k == ord(' '): # 如果按空格键则程序结束breakcv.destroyAllWindows() # 释放内存cap.release() # 释放摄像头
3.效果展示
捕获并录入人脸,如图2.1所示。

图2.1 录入
三、数据训练
1.程序介绍
此步骤主要是将录入的人脸信息进行训练,即把图片信息通过函数和算法转换成计算机可以识别的数据信息,并将其保存到一个新建的yml文件中,用于下一步人脸识别时的数据比对。
2.代码展示及解读
# 导入以下模块import cv2import osfrom PIL import Imageimport numpy as np# 创建getImageAndLabels函数def getImageAndLabels(path):facesSamples = [] # 储存人脸数据ids = [] # 储存姓名数据imagePaths = [os.path.join(path, f)for f in os.listdir(path)] # 储存图片信息face_detect = cv2.CascadeClassifier( # 加载分类器'D:/PYcharmProject/Hello World/venv/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml' )for imagePath in imagePaths: # 遍历列表中的图片# 打开图片,灰度化PIL有九种不同的模式:1,L,P,RGB,RGBA,CMYK,YCbCr,I,FPIL_img = Image.open(imagePath).convert('L')img_numpy = np.array(PIL_img, 'uint8') # 将图像转换为数组,用于计算机判别faces = face_detect.detectMultiScale(img_numpy) # 调用分类器提取人脸区域数组id = int(os.path.split(imagePath)[1].split('.')[1]) # 获取每张图片的id和姓名for (x, y, w, h) in faces: # 预防无面容的照片ids.append(id)facesSamples.append(img_numpy[y:y+h, x:x+w])print("id:", id) # 打印idprint("fs:", facesSamples) # 打印脸部特征return facesSamples, idsif __name__ == '__main__':path = './venv/jm/' # 图片路径facesSamples, ids = getImageAndLabels(path) # 调用getImageAndLabels函数,获取图片数组和id标签数组和姓名recognizer = cv2.face.LBPHFaceRecognizer_create() # 加载识别器recognizer.train(facesSamples, np.array(ids)) # 图片训练recognizer.write('trainer/trainer.yml') # 保存图片到新建的yml文件下
四、人脸识别
1.程序介绍
此步骤主要功能是人脸识别。首先调用摄像头检测人脸并将人脸框出,然后调用上一步创建好的yml文件,将本次检测到的人脸信息与保存的人脸信息进行比对,匹配成功则在人脸框的左上方显示此人姓名,匹配不成功则显示“unknow”。
2.代码展示及解读
# 导入以下模块import cv2import osrecognizer = cv2.face.LBPHFaceRecognizer_create() # 加载训练数据集文件recognizer.read('trainer/trainer.yml') # 加载数据names = [] # 名称warningtime = 0 # 警报全局变量# 准备识别的图片def face_detect_demo(img):gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转为灰度图face_detect = cv2.CascadeClassifier( # 加载分类器'D:/PYcharmProject/Hello World/venv/Lib/site-packages/cv2/data/haarcascade_frontalface_alt2.xml')face = face_detect.detectMultiScale(gray, 1.1, 5, cv2.CASCADE_SCALE_IMAGE) # 调用人脸检测库for (x, y, w, h) in face:cv2.rectangle(img, (x, y), (x + w, y + h), color=(255, 0, 0), thickness=2) # 检测人脸并将人脸框起来ids, confidence = recognizer.predict(gray[y:y+h, x:x+w]) # 对人脸进行评分,评分值越大越不可信if confidence > 80:global warningtimewarningtime += 1 # 评分值大于80,警报变量加一if warningtime > 100:warningtime = 0# 警报变量大于100,判断不是正确人脸,在框左上角显示'Unknown'cv2.putText(img, 'Unknown', (x+10, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 1)else:# 警报变量不大于100,判断是正确人脸,在框左上角显示姓名cv2.putText(img, str(names[ids-1000]), (x+10, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)cv2.imshow('result', img)def Name():path = './venv/jm/' # 图片路径imagePaths = [os.path.join(path, f) for f in os.listdir(path)]for imagePath in imagePaths:name = str(os.path.split(imagePath)[1].split('.')[2]) # 获取姓名names.append(name)# 打开摄像头cap = cv2.VideoCapture(0)Name() # 调用Name函数while True:flag, frame = cap.read() # 得到每帧图像if not flag:breakface_detect_demo(frame) # 调用def face_detect_demo函数if ord(' ') == cv2.waitKey(1): # 判断如果是空格键程序结束breakcv2.destroyAllWindows() # 释放内存cap.release() # 释放摄像头
3.效果展示
识别已录入的人脸,如图4.1所示。

图4.1 识别



点点“分享”,给我充点儿电吧~
文章转载自众智创新团队,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




