python opencv3 人脸识别的例子

一个人脸识别的例子

程序中用到了公共数据集, 欢迎去我的git上下载源码,源码里带有数据集

git:https://github.com/linyi0604/Computer-Vision

 

脚本中一个三个函数

第一个: 调用本机摄像头采集一些自己的照片 作为数据集的一部分

第二个:把自己的照片 和公共数据集照片一并读取 作为输入数据

第三个: 预测函数  调用第二个函数拿到x 和y 进行训练后 开启摄像头 进行预测

 

  1 # coding:utf-8
  2 
  3 import cv2
  4 import os
  5 import numpy as np
  6 
  7 
  8 # 1 生成人脸识别数据
  9 #  图像是灰度格式,后缀名.pgm
 10 #  图像是正方形 图像大小要一样 在这里使用200*200
 11 def generate():
 12     # 加载检测图像中人脸位置的对象, xml文件需要去opencv文件夹里面找, 放到项目里面来引入
 13     face_cascade = cv2.CascadeClassifier("../data/haarcascade_frontalface_default.xml")
 14     # 调用本机摄像头
 15     camera = cv2.VideoCapture(0)
 16     count = 0
 17     # 读取摄像头
 18     while True:
 19         # 读入 帧
 20         ret, frame = camera.read()
 21         # 变为灰度图像
 22         gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
 23         # 检测人脸位置
 24         faces = face_cascade.detectMultiScale(gray, 1.3, 5)
 25         # 将图片中人脸位置单独拿出来改变成200*200大小的图片 存入本地 作为数据集
 26         for (x, y, w, h) in faces:
 27             img = cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
 28             f = cv2.resize(gray[y:y+h, x:x+w], (200, 200))
 29             cv2.imwrite("./data/%s.pgm" % str(count), f)
 30             count += 1
 31 
 32         cv2.imshow("camera", frame)
 33         # 如果按键q就退出 否则等50毫秒
 34         if cv2.waitKey(50) & 0xff == ord("q"):
 35             break
 36 
 37     camera.release()
 38     cv2.destroyAllWindows()
 39 
 40 
 41 # 读取生成好的数据 在我项目目录下整理好的
 42 def readImages():
 43     x, y = [], []
 44     path = "./data/faces/"
 45     image_file = os.listdir(path)
 46     image_files = [path + i for i in image_file]
 47     for file in image_files:
 48         images = os.listdir(file)
 49         label = file.split("/")[-1][1:]
 50         for i in images:
 51             img = cv2.imread(file + "/" + i, cv2.IMREAD_GRAYSCALE)
 52             img = cv2.resize(img, (200, 200))
 53             x.append(np.asarray(img, dtype=np.uint8))
 54             y.append(int(label))
 55 
 56     y = np.asarray(y, dtype=np.int32)
 57     return x, y
 58 
 59 
 60 # 检测人脸
 61 def face_rec():
 62     # 获取数据
 63     x, y = readImages()
 64 
 65     # 人脸识别的模型
 66     model = cv2.face.EigenFaceRecognizer_create()
 67     # fisherfaces算法的模型
 68     # model = cv2.face.FisherFaceRecognizer_create()
 69     # LBPH算法的模型
 70     # model = cv2.face.LBPHFaceRecognizer_create()
 71     """
 72     Eigenfaces和Fisherfaces 预测时候产生0到20000的评分
 73         低于4000 5000 的评分都是相当可靠的
 74     LBPH 产生评分不同,低于50是可靠的 高于80是不可靠的
 75     """
 76 
 77     # 训练模型
 78     model.train(np.asarray(x), np.asarray(y))
 79 
 80     # 开摄像头
 81     camera = cv2.VideoCapture(0)
 82     # 加载检测人脸对象
 83     face_cascade = cv2.CascadeClassifier("../data/haarcascade_frontalface_default.xml")
 84     while True:
 85         # 读取当前帧
 86         read, img = camera.read()
 87         # 当前帧下检测人脸
 88         faces = face_cascade.detectMultiScale(img, 1.3, 5)
 89         for (x, y, w, h) in faces:
 90             # 画出人脸
 91             img = cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
 92             # 转成灰度图
 93             gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 94             # 拿出人脸部分
 95             roi = gray[x: x+w, y: y+h]
 96             try:
 97                 # 更改大小
 98                 roi = cv2.resize(roi, (200, 200), interpolation=cv2.INTER_LINEAR)
 99                 # 进行预测
100                 params = model.predict(roi)
101                 # 在图像上写预测结果
102                 # 1.2是字体大小 2是粗细
103                 img = cv2.putText(img, str(params[0]), (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 255, 0), 2)
104                 # prams是一个二元素列表, 第一个元素是预测结果,第二个元素是得分情况
105                 print(params)
106 
107             except Exception as e:
108                 print(e)
109         cv2.imshow("detect face", img)
110         if cv2.waitKey(5) & 0xff == ord("q"):
111             break
112 
113     cv2.destroyAllWindows()
114 
115 
116 if __name__ == '__main__':
117     # 调用摄像头 采集人脸照片数据
118     # generate()
119 
120     # 检测人脸
121     face_rec()
原文地址:https://www.cnblogs.com/Lin-Yi/p/9427697.html