当前位置:   article > 正文

opencv人脸识别实战1:初始化及录入人脸(PyCharm实现)_config.txt人脸识别

config.txt人脸识别

 一、初始化

开始前先导入必要的库,在conda中用 pip install package 指令安装。

  1. import cv2
  2. import numpy as np
  3. import os
  4. import shutil
  5. import threading
  6. import tkinter as tk
  7. from PIL import Image, ImageTk

注意在运行时可能会出现AttributeError: module ‘cv2‘ has no attribute ‘face‘的报错,需要用 

pip install opencv-python

安装一个 opencv-python的包,如果此时还是无法运行,需要重新安装这两个包。

  1. pip uninstall opencv-python
  2. pip uninstall opencv-contrib-python
  3. pip install opencv-python
  4. pip install opencv-contrib-python

接下来用字典对存储关系键值对,再记录录入共计的人脸。

  1. id_dict = {}
  2. Total_face_num = 999

将config文件的信息存入字典中

  1. def init():
  2. f = open('config.txt')
  3. global Total_face_num
  4. Total_face_num = int(f.readline())
  5. for i in range(int(Total_face_num)):
  6. line = f.readline()
  7. id_name = line.split(' ')
  8. id_dict[int(id_name[0])] = id_name[1]
  9. f.close()

加载检测器Haar和识别方法LBPH,接下来打开摄像头,并读取照片

  1. face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
  2. recognizer = cv2.face.LBPHFaceRecognizer_create()
  3. camera = cv2.VideoCapture(0)
  4. success, img = camera.read()
  5. W_size = 0.1 * camera.get(3)
  6. H_size = 0.1 * camera.get(4)
  7. system_state_lock = 0 # 相当于mutex锁,用于线程同步

二、录入人脸

  1. def Get_new_face():
  2. filepath = "data"
  3. if not os.path.exists(filepath):
  4. os.mkdir(filepath)
  5. else:
  6. shutil.rmtree(filepath)
  7. os.mkdir(filepath)
  8. sample_num = 0
  9. while True:
  10. global success
  11. global img
  12. success, img = camera.read()
  13. # 转为灰度图片
  14. if success is True:
  15. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  16. else:
  17. break
  18. faces = face_cascade.detectMultiScale(gray, 1.3, 5)
  19. for (x, y, w, h) in faces:
  20. cv2.rectangle(img, (x, y), (x + w, y + w), (255, 0, 0))
  21. sample_num += 1
  22. T = Total_face_num
  23. cv2.imwrite("./data/User." + str(T) + '.' + str(sample_num) + '.jpg', gray[y:y + h, x:x + w])
  24. pictur_num = 1000 # 表示摄像头拍摄取样的数量,越多效果越好,但获取以及训练的越慢
  25. cv2.waitKey(1)
  26. if sample_num > pictur_num:
  27. break
  28. else:
  29. l = int(sample_num / pictur_num * 50)
  30. r = int((pictur_num - sample_num) / pictur_num * 50)
  31. print("\r" + "%{:.1f}".format(sample_num / pictur_num * 100) + "=" * l + "->" + "_" * r, end="")
  32. var.set("%{:.1f}".format(sample_num / pictur_num * 100)) # 控件可视化进度信息
  33. window.update()

创建一个函数,用于从数据集文件夹中获取训练图片并获取id

  1. def get_images_and_labels(path):
  2. image_paths = [os.path.join(path, f) for f in os.listdir(path)]
  3. face_samples = []
  4. ids = []
  5. for image_path in image_paths:
  6. img = Image.open(image_path).convert('L')
  7. img_np = np.array(img, 'uint8')
  8. if os.path.split(image_path)[-1].split(".")[-1] != 'jpg':
  9. continue
  10. id = int(os.path.split(image_path)[-1].split(".")[1]) # 为了获取id,将图片和路径分裂并获取
  11. # 调用熟悉的人脸分类器
  12. detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
  13. faces = detector.detectMultiScale(img_np)
  14. # 将获取的图片和id添加到list中
  15. for (x, y, w, h) in faces:
  16. face_samples.append(img_np[y:y + h, x:x + w])
  17. ids.append(id)
  18. return face_samples, ids

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/763673
推荐阅读
相关标签
  

闽ICP备14008679号