Python+opencv 人脸识别----阔别8年后重学编程的点点滴滴

因为疫情已经在家里困了一个月零5天了,在家辅导幼儿园小朋友作业,其余时间没什么事,想着阔别了8年之久的编程工作,看着最近的科技产品越来越发达,还是想自己编点东西玩玩,网上搜了搜python的学习,这就开始吧。 —2020年2月29日

先立个Flag放到这,希望经过系统的学习和实验,能够完成这样一个效果:
1、摄像头立在公司门口,经过的员工进行人脸识别,记录来单位的时间。
2、再结合一个红外摄像头还是什么的,对该员工进行温度测量,并记录。
3、加个喇叭,体温正常了问个好,让员工开心上班;温度不正常了发出警告。
4、再有什么功能了再想。
然后一起学习,一起尝试着做出来吧。

鉴于目前什么都不会,先来第一步,让电脑认识我。

1、openCV人脸识别器cv2.face

1、环境搭建

之前的环境搭建业费了些事,不过网上有很多文章,大家可以看看。

至于cv2.face,我昨晚又下载了2个小时才弄好。
简单的说就是之前 pip install opencv-python 时安装的cv2不包含人脸识别部分,需要重新pip
首先把老的删掉,pip uninstall opencv-python,把之前安装的cv2删除,然后pip install opencv-contrib-python,安装新的包。
安装时很费劲,速度只有几k,还经常中断,不知道其他人怎么样,我是一遍一遍的重试,总会成功的,欢迎知道解决方案的朋友留言,谢谢大家。

2、人脸照片准备

做人脸识别,首先得让及其认识人,openCV中认人的方法就是通过足够的照片,来认识到一个人脸部的特征,然后看到新照片时才能认识。
SO,第一步准备照片。我准备了三个人的照片,妻子,儿子和我自己的。
准备的照片按照规则命名,并放在对应的文件夹里。在这里插入图片描述按照规则命名,里面的照片名也是1、2、3…这样的,好让程序循环读入。

3、代码实现

主要是学习了beyond_LH 的文章,谢谢beyond_LH 的无私分享。
文章地址如下:
beyong_LH写的识别黄家驹,黄家强兄弟的程序

大部分程序实现借鉴了上面文章的写法,针对自己的想法改了一些具体应用,思路是一样的。
首先导入包

import cv2
import os
import numpy as np

然后是检测人脸的函数
其中‘haarcascade_frontalface_default.xml’我是在python的目录里搜索到复制出来的,网上说自己没有的话需要下载,大家可以自己找。
另外目前做到的水平是一张图片只识别一张脸,能成功后再尝试多人同时出镜。

#检测人脸
def detect_face(img):
    #将检测图片转化为灰度图,因为openCV人脸识别用的是灰度图像
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

    #加载OpenCV人脸检测分类器Haar
    face_cascade = cv2.CascadeClassifier('D:/PycharmProjects/Tset2/haarcascade_frontalface_default.xml')

    #检测多尺度图像,返回值是一张脸部区域信息的列表(x,y,width,height)
    faces = face_cascade.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=5)

     #如果没有检测到人脸,返回原始图像
    if (len(faces) == 0):
        return None,None

    #目前假设只有一张脸,x,y为左上角坐标,w,h为矩形的宽高
    (x,y,w,h) = faces[0]

    #返回图像的正面部分
    return gray[y:y+w,x:x+h],faces[0]

做一个读取图片的函数,返回人脸信息和对应的标签信息
这里就和之前建立文件夹和文件的命名规则对应了。

#该函数用于读取所有的训练图像,从每个图像检测人脸并将返回两个相同大小的列表,分别为脸部信息和标签
def prepare_training_data(data_folder_path):
    # 获取数据文件夹中的目录(每个主题一个目录)
    dirs = os.listdir(data_folder_path)

    #建立两个列表,分别保存所有的脸部信息和标签
    faces = []
    labels = []

    #浏览每个目录并访问其中的图像
    for dir_name in dirs:
        #dir_name(str类型)既标签
        label = int(dir_name)
        #建立包含当前主题主题图像的目录路径
        subject_dir_path = data_folder_path + '/' + dir_name
        #获取主题目录下图像名称
        subject_images_names = os.listdir(subject_dir_path)

        #浏览每张图片并检测脸部,然后将脸部信息添加到脸部列表
        for image_name in subject_images_names:
            #建立图像路径
            image_path = subject_dir_path + '/' + image_name
            #读取图像
            image = cv2.imread(image_path)
            #显示图像0.1s
            cv2.imshow('Training on Image...',image)
            cv2.waitKey(50)

            #脸部检测
            face,rect = detect_face(image)
            #忽略未检测到得脸部,其他的加入列表
            if face is not None:
                faces.append(face)
                labels.append(label)
                print(str(image_path)+'   '+str(label))

    cv2.waitKey(1)
    cv2.destroyAllWindows()

    #返回人脸和标签列表
    return faces,labels

调用训练函数,得到脸部图片列表和对应的标签列表
参数是data_folder_path 存放训练图片的文件夹路径

#调用训练函数
faces,labels = prepare_training_data('f:/FaceRegTest')

人脸特征识别!!!
最牛逼的步骤,但是都是大神们实现好的,我们只需要调用就行了

首次使用或者更新训练图片时要让识别器进行训练

#创建LBPH识别器并开始训练,也可以使用Eigen或者Fisher识别器
face_recognizer = cv2.face.LBPHFaceRecognizer_create()
face_recognizer.train(faces
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值