因为疫情已经在家里困了一个月零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