zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    机器学习 —— 概率图模型(学习:最大似然估计)
    机器学习 —— 概率图模型(学习:综述)
    机器学习 —— 概率图模型(推理:决策)
    机器学习 —— 概率图模型(推理:连续时间模型)
    我的c++学习(3)字符的输入输出
    法国人的浪漫精神从在于他们的灵魂之中(转)
    我的c++学习(2)比较两个数字大小
    我的c++学习(1)hello world!
    获取datable中某行某列的数据
    学习资源asp.net
  • 原文地址:https://www.cnblogs.com/Lin-Yi/p/9427697.html
Copyright © 2011-2022 走看看