获取人脸图片和训练人脸

11 篇文章 4 订阅
8 篇文章 4 订阅

基于树莓派的人脸识别门禁系统(python+OpenCV+PyQt)

技术难点:

  1. 登录界面准确的将数据输入到指定的 QLineEdit上
  2. 多线程实现识别人脸、录入人脸和加载进度条
  3. 获取人脸图片和训练人脸
  4. 实现人脸和姓名一一对应

获取人脸图片和训练人脸


我这里将获取的人脸照片存放到一个文件夹里面,将训练好的yml文件存放在另一个文件夹下面,如下,Face_data 存放的是人脸照片,Face_training 存放的是训练好的 yml 文件,faceReco.py 就是源码文件了,这三个文件都在同一级目录下。直接使用代码创建存放文件夹和训练文件夹。

1、捕获人脸照片

  • 图像处理
  • 创建文件夹(满权限创建,否则不能将图片写进文件夹)
  • 捕获人脸照片并保存
# 创建目录,将获取的人脸照片放入指定的文件夹
self.file = "./Face_data/"

while(True):
    ret, self.img = self.cap.read()
    # 垂直翻转视频图像
    self.img = cv2.flip(self.img, -1)
    # 灰度化处理
    gray = cv2.cvtColor(self.img, cv2.COLOR_BGR2GRAY)
    faces = faceCascade2.detectMultiScale(gray, 1.3, 5)
    
    # 判断是否存在文件夹如果不存在则创建为文件夹
    self.folder = os.path.exists(self.file)
    if not self.folder:  
        # makedirs 满权限创建文件时如果路径不存在会创建这个路径
        os.makedirs(self.file)  
        os.chmod(self.file,0777)
    
    for (x,y,w,h) in faces:
        cv2.rectangle(self.img, (x,y), (x+w,y+h), (255,0,0), 2)     
        self.count += 1
        # 将捕获的图像保存到指定的文件夹中
        bool = cv2.imwrite(self.file + "/User." + str(self.Edit_ID.text()) + '.' + str(self.count) + ".png", gray[y:y+h,x:x+w])
        
    # 取60张人脸样本,停止录像
    if self.count >= 60: 
        print("OK!")
        break

2、训练人脸

从数据集文件夹中载入训练图片,获取到人脸和id,整理成list并返回,人后调用函数进行训练

  • 创建文件夹(满权限创建,否则不能将图片写进文件夹)
  • 对捕获的人脸照片进行训练
  • 将训练好的数据保存
# 函数获取图像和标签数据
def getImagesAndLabels(path):
    imagePaths = [os.path.join(path,f) for f in os.listdir(path)]     
    faceSamples=[]
    ids = []
    self.progressBar.setProperty("value", 65)
    for imagePath in imagePaths:
        # 转换为灰度
        PIL_img = Image.open(imagePath).convert('L') 
        img_numpy = np.array(PIL_img,'uint8')
        id = int(os.path.split(imagePath)[-1].split(".")[1])

        faces = faceCascade3.detectMultiScale(img_numpy)
        for (x,y,w,h) in faces:
            faceSamples.append(img_numpy[y:y+h,x:x+w])
            ids.append(id)
    return faceSamples,ids
self.progressBar.setProperty("value", 75)
print ("\n [INFO] Training faces. It will take a few seconds. Wait ...")

# 调用函数,传递文件夹路径参数
faces,ids = getImagesAndLabels(self.file)
# 训练人脸
self.recognizer.train(faces, np.array(ids))
self.progressBar.setProperty("value", 85)

# 创建文件夹
self.triningfile = "./Face_training/"
self.folder1 = os.path.exists(self.triningfile)
if not self.folder1:  
    os.makedirs(self.triningfile)  
    os.chmod(self.triningfile,0777)
    
# 将训练好的数据保存到指定文件夹中
self.recognizer.write(self.triningfile + "/trainer.yml")

# 打印经过训练的人脸编号和结束程序
print("\n [INFO] {0} faces trained. Exiting Program".format(len(np.unique(ids))))
self.progressBar.setProperty("value", 100)

 

好的,我可以为您提供一个基于PythonOpenCV人脸录入、识别系统的简单实现。 首先,需要安装OpenCV库和Python的相关库。可以使用以下命令安装: ``` pip install opencv-python pip install numpy pip install Pillow ``` 接下来,我们需要进行人脸录入。实现方法如下: 1. 创建一个名为“dataset”文件夹,用于存储我们录入的人脸数据。 2. 运行以下代码: ``` import cv2 import os # 定义一个函数来录入人脸数据 def face_dataset(): # 使用OpenCV中的Haar级联分类器来检测人脸 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # 打开摄像头 cap = cv2.VideoCapture(0) # 输入姓名 name = input("请输入你的名字:") # 创建一个文件夹,用于存储当前用户的人脸数据 folder_name = 'dataset/' + name if not os.path.exists(folder_name): os.makedirs(folder_name) # 计数器,用于给保存的图片命名 count = 0 while True: # 读取摄像头中的画面 ret, frame = cap.read() # 转换为灰度图像 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 检测人脸 faces = face_cascade.detectMultiScale(gray, 1.3, 5) # 对每一张检测到的人脸进行处理 for (x, y, w, h) in faces: # 截取人脸区域 roi_gray = gray[y:y+h, x:x+w] # 将人脸保存到文件夹中 cv2.imwrite(folder_name + '/' + str(count) + '.jpg', roi_gray) # 在摄像头画面中框出人脸 cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2) # 计数器加一 count += 1 # 在摄像头画面中显示人脸 cv2.imshow('frame', frame) # 按'q'键退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放摄像头资源 cap.release() # 关闭所有窗口 cv2.destroyAllWindows() ``` 运行上述代码后,会打开摄像头,要求输入姓名,并将录入的人脸数据保存在“dataset”文件夹中。 接下来,我们需要进行人脸识别。实现方法如下: 1. 创建一个名为“trainer.yml”的文件,用于存储训练模型。 2. 运行以下代码: ``` import cv2 import numpy as np import os # 定义一个函数来训练人脸识别模型 def face_training(): # 使用OpenCV中的LBPH算法来训练人脸识别模型 recognizer = cv2.face_LBPHFaceRecognizer.create() # 获取数据集中的人脸数据和标签 faces = [] labels = [] for folder_name in os.listdir('dataset'): label = int(folder_name.split('_')[0]) for filename in os.listdir('dataset/' + folder_name): img = cv2.imread('dataset/' + folder_name + '/' + filename, cv2.IMREAD_GRAYSCALE) faces.append(img) labels.append(label) # 训练人脸识别模型 recognizer.train(faces, np.array(labels)) # 将训练好的模型保存到文件中 recognizer.save('trainer.yml') ``` 运行上述代码后,会从“dataset”文件夹中读取人脸数据并训练人脸识别模型,并将模型保存到“trainer.yml”文件中。 最后,我们来进行人脸识别。实现方法如下: ``` import cv2 import numpy as np # 定义一个函数来进行人脸识别 def face_recognition(): # 使用OpenCV中的Haar级联分类器来检测人脸 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # 加载训练好的人脸识别模型 recognizer = cv2.face.LBPHFaceRecognizer_create() recognizer.read('trainer.yml') # 创建一个字典,用于将标签转换为姓名 names = { 0: '张三', 1: '李四', 2: '王五', # 依次类推 } # 打开摄像头 cap = cv2.VideoCapture(0) while True: # 读取摄像头中的画面 ret, frame = cap.read() # 转换为灰度图像 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 检测人脸 faces = face_cascade.detectMultiScale(gray, 1.3, 5) # 对每一张检测到的人脸进行处理 for
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ONESTAR博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值