上一节讲到人脸检测,现在讲一下人脸识别。具体是通过程序采集图像并进行训练,并且基于这些训练的图像对人脸进行动态识别。

人脸识别前所需要的人脸库可以通过两种方式获得:1.自己从视频获取图像   2.从人脸数据库免费获得可用人脸图像,如ORL人脸库(包含40个人每人10张人脸,总共400张人脸),ORL人脸库中的每一张图像大小为92x112。若要对这些样本进行人脸识别必须要在包含人脸的样本图像上进行人脸识别。这里提供自己准备图像识别出自己的方法。

1.采集人脸信息:通过摄像头采集人脸信息,10张以上即可,把图像大小调整为92x112,保存在一个指定的文件夹,文件名后缀为.png

def generator(data):
'''
打开摄像头,读取帧,检测该帧图像中的人脸,并进行剪切、缩放
生成图片满足以下格式:
1.灰度图,后缀为 .png
2.图像大小相同
params:
data:指定生成的人脸数据的保存路径
''' name=input('my name:')
#如果路径存在则删除路径
path=os.path.join(data,name)
if os.path.isdir(path):
shutil.rmtree(path)
#创建文件夹
os.mkdir(path)
#创建一个级联分类器
face_casecade=cv2.CascadeClassifier('../haarcascades/haarcascade_frontalface_default.xml')
#打开摄像头
camera=cv2.VideoCapture(0)
cv2.namedWindow('Dynamic')
#计数
count=1 while(True):
#读取一帧图像
ret,frame=camera.read()
if ret:
#转换为灰度图
gray_img=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
#人脸检测
face=face_casecade.detectMultiScale(gray_img,1.3,5)
for (x,y,w,h) in face:
#在原图上绘制矩形
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)
#调整图像大小
new_frame=cv2.resize(frame[y:y+h,x:x+w],(92,112))
#保存人脸
cv2.imwrite('%s/%s.png'%(path,str(count)),new_frame)
count+=1
cv2.imshow('Dynamic',frame)
#按下q键退出
if cv2.waitKey(100) & 0xff==ord('q'):
break
camera.release()
cv2.destroyAllWindows()

该程序运行后会在指定的data路径下创建一个你输入的人名的文件夹用于存放采集到的图像,在这里我输入了wjy,结果如图

2.人脸识别

OpenCV有3中人脸识别方法,分别基于三个不同算法,分别为Eigenfaces,Fisherfaces和Local Binary Pattern Histogram

这些方法都有类似的一个过程,即先对数据集进行训练,对图像或视频中的人脸进行分析,并且从两个方面确定:1.是否识别到对应的目标,2.识别到的目标的置信度,在实际中通过阈值进行筛选,置信度高于阈值的人脸将被丢弃

这里介绍一下利用特征脸即Eigenfaces进行人脸识别算法,特征脸法本质上就是PCA降维,基本思路是先把图像灰度化,转化为单通道,再将它首位相接转换为列向量,假设图像的大小是20*20的,那么这个向量就是400维,但是维度太高算法复杂度也会升高,所以需要降维,再使用简单排序即可

#载入图像   读取ORL人脸数据库,准备训练数据
def LoadImages(data):
'''
加载图片数据用于训练
params:
data:训练数据所在的目录,要求图片尺寸一样
ret:
images:[m,height,width] m为样本数,height为高,width为宽
names:名字的集合
labels:标签
'''
images=[]
names=[]
labels=[] label=0 #遍历所有文件夹
for subdir in os.listdir(data):
subpath=os.path.join(data,subdir)
#print('path',subpath)
#判断文件夹是否存在
if os.path.isdir(subpath):
#在每一个文件夹中存放着一个人的许多照片
names.append(subdir)
#遍历文件夹中的图片文件
for filename in os.listdir(subpath):
imgpath=os.path.join(subpath,filename)
img=cv2.imread(imgpath,cv2.IMREAD_COLOR)
gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#cv2.imshow('1',img)
#cv2.waitKey(0)
images.append(gray_img)
labels.append(label)
label+=1
images=np.asarray(images)
#names=np.asarray(names)
labels=np.asarray(labels)
return images,labels,names #检验训练结果
def FaceRec(data):
#加载训练的数据
X,y,names=LoadImages(data)
#print('x',X)
model=cv2.face.EigenFaceRecognizer_create()
model.train(X,y) #打开摄像头
camera=cv2.VideoCapture(0)
cv2.namedWindow('Dynamic') #创建级联分类器
face_casecade=cv2.CascadeClassifier('../haarcascades/haarcascade_frontalface_default.xml') while(True):
#读取一帧图像
#ret:图像是否读取成功
#frame:该帧图像
ret,frame=camera.read()
#判断图像是否读取成功
#print('ret',ret)
if ret:
#转换为灰度图
gray_img=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) #利用级联分类器鉴别人脸
faces=face_casecade.detectMultiScale(gray_img,1.3,5) #遍历每一帧图像,画出矩形
for (x,y,w,h) in faces:
frame=cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2) #蓝色
roi_gray=gray_img[y:y+h,x:x+w] try:
#将图像转换为宽92 高112的图像
#resize(原图像,目标大小,(插值方法)interpolation=,)
roi_gray=cv2.resize(roi_gray,(92,112),interpolation=cv2.INTER_LINEAR)
params=model.predict(roi_gray)
print('Label:%s,confidence:%.2f'%(params[0],params[1]))
'''
putText:给照片添加文字
putText(输入图像,'所需添加的文字',左上角的坐标,字体,字体大小,颜色,字体粗细)
'''
cv2.putText(frame,names[params[0]],(x,y-20),cv2.FONT_HERSHEY_SIMPLEX,1,255,2)
except:
continue cv2.imshow('Dynamic',frame) #按下q键退出
if cv2.waitKey(100) & 0xff==ord('q'):
break
camera.release()
cv2.destroyAllWindows()

在程序中,我们用cv2.face.EigenFaceRecognizer_create()创建人脸识别的模型,通过图像数组和对应标签数组来训练模型,该函数有两个重要的参数,1.保留主成分的数目,2.指定的置信度阈值,为一个浮点型。

下面就是基本重复人脸检测的相关操作,通过检测到视频中的人脸进行人脸识别,有如下两个步骤:

1.将检测到的人脸图像调整为92x112,即需要和训练的图像的尺寸相同

2.调用predict()函数进行人脸预测,该函数会返回两个元素的数组,第一个是识别个体的标签,第二个是置信度,越小匹配度越高,0表示完全匹配,需要了解的是不同算法的置信度评分机制不同。

附上结果图

这里附上全部源代码“

# -*- coding: utf-8 -*-
"""
Created on Sat Oct 27 11:43:47 2018 @author: Administrator
""" '''
调用opencv的库实现人脸识别
''' import cv2
import numpy as np
import os
import shutil #采集自己的人脸数据
def generator(data):
'''
打开摄像头,读取帧,检测该帧图像中的人脸,并进行剪切、缩放
生成图片满足以下格式:
1.灰度图,后缀为 .png
2.图像大小相同
params:
data:指定生成的人脸数据的保存路径
''' name=input('my name:')
#如果路径存在则删除路径
path=os.path.join(data,name)
if os.path.isdir(path):
shutil.rmtree(path)
#创建文件夹
os.mkdir(path)
#创建一个级联分类器
face_casecade=cv2.CascadeClassifier('../haarcascades/haarcascade_frontalface_default.xml')
#打开摄像头
camera=cv2.VideoCapture(0)
cv2.namedWindow('Dynamic')
#计数
count=1 while(True):
#读取一帧图像
ret,frame=camera.read()
if ret:
#转换为灰度图
gray_img=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
#人脸检测
face=face_casecade.detectMultiScale(gray_img,1.3,5)
for (x,y,w,h) in face:
#在原图上绘制矩形
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)
#调整图像大小
new_frame=cv2.resize(frame[y:y+h,x:x+w],(92,112))
#保存人脸
cv2.imwrite('%s/%s.png'%(path,str(count)),new_frame)
count+=1
cv2.imshow('Dynamic',frame)
#按下q键退出
if cv2.waitKey(100) & 0xff==ord('q'):
break
camera.release()
cv2.destroyAllWindows() #载入图像 读取ORL人脸数据库,准备训练数据
def LoadImages(data):
'''
加载图片数据用于训练
params:
data:训练数据所在的目录,要求图片尺寸一样
ret:
images:[m,height,width] m为样本数,height为高,width为宽
names:名字的集合
labels:标签
'''
images=[]
names=[]
labels=[] label=0 #遍历所有文件夹
for subdir in os.listdir(data):
subpath=os.path.join(data,subdir)
#print('path',subpath)
#判断文件夹是否存在
if os.path.isdir(subpath):
#在每一个文件夹中存放着一个人的许多照片
names.append(subdir)
#遍历文件夹中的图片文件
for filename in os.listdir(subpath):
imgpath=os.path.join(subpath,filename)
img=cv2.imread(imgpath,cv2.IMREAD_COLOR)
gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#cv2.imshow('1',img)
#cv2.waitKey(0)
images.append(gray_img)
labels.append(label)
label+=1
images=np.asarray(images)
#names=np.asarray(names)
labels=np.asarray(labels)
return images,labels,names #检验训练结果
def FaceRec(data):
#加载训练的数据
X,y,names=LoadImages(data)
#print('x',X)
model=cv2.face.EigenFaceRecognizer_create()
model.train(X,y) #打开摄像头
camera=cv2.VideoCapture(0)
cv2.namedWindow('Dynamic') #创建级联分类器
face_casecade=cv2.CascadeClassifier('../haarcascades/haarcascade_frontalface_default.xml') while(True):
#读取一帧图像
#ret:图像是否读取成功
#frame:该帧图像
ret,frame=camera.read()
#判断图像是否读取成功
#print('ret',ret)
if ret:
#转换为灰度图
gray_img=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) #利用级联分类器鉴别人脸
faces=face_casecade.detectMultiScale(gray_img,1.3,5) #遍历每一帧图像,画出矩形
for (x,y,w,h) in faces:
frame=cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2) #蓝色
roi_gray=gray_img[y:y+h,x:x+w] try:
#将图像转换为宽92 高112的图像
#resize(原图像,目标大小,(插值方法)interpolation=,)
roi_gray=cv2.resize(roi_gray,(92,112),interpolation=cv2.INTER_LINEAR)
params=model.predict(roi_gray)
print('Label:%s,confidence:%.2f'%(params[0],params[1]))
'''
putText:给照片添加文字
putText(输入图像,'所需添加的文字',左上角的坐标,字体,字体大小,颜色,字体粗细)
'''
cv2.putText(frame,names[params[0]],(x,y-20),cv2.FONT_HERSHEY_SIMPLEX,1,255,2)
except:
continue cv2.imshow('Dynamic',frame) #按下q键退出
if cv2.waitKey(100) & 0xff==ord('q'):
break
camera.release()
cv2.destroyAllWindows() if __name__=='__main__':
data='./face'
#generator(data)
FaceRec(data)

2018.10.28

python中使用Opencv进行人脸识别的更多相关文章

  1. OpenCV-Python(1)在Python中使用OpenCV进行人脸检测

    OpenCV是如今最流行的计算机视觉库,而我们今天就是要学习如何安装使用OpenCV,以及如何去访问我们的摄像头.然后我们一起来看看写一个人脸检测程序是如何地简单,简单到只需要几行代码. 在开始之前, ...

  2. python中使用Opencv进行人脸检测

    这两天学习了人脸识别,看了学长写的代码,边看边码边理解搞完了一边,再又是自己靠着理解和记忆硬码了一边,感觉还是很生疏,就只能来写个随笔加深一下印象了. 关于人脸识别,首先需要了解的是级联分类器Casc ...

  3. 转:基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴等)【模式识别中的翘楚】

    文章来自于:http://blog.renren.com/share/246648717/8171467499 基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴 ...

  4. 使用OpenCV进行人脸识别

    不断维护的地址:http://plzcoding.com/face-recognition-with-opencv/ 怎样使用OpenCV进行人脸识别 本文大部分来自OpenCV官网上的Face Re ...

  5. 基于 OpenCV 的人脸识别

    基于 OpenCV 的人脸识别 一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenC ...

  6. PyQt5+Caffe+Opencv搭建人脸识别登录界面

    PyQt5+Caffe+Opencv搭建人脸识别登录界面(转载) 最近开始学习Qt,结合之前学习过的caffe一起搭建了一个人脸识别登录系统的程序,新手可能有理解不到位的情况,还请大家多多指教. 我的 ...

  7. opencv+opencv_contrib 人脸识别和检测 python开发环境快速搭建(30分钟)图文教程

    很多朋友为了学习python.ML(机器学习).DL(深度学习).opencv等花费了大量时间配置安装环境(一个朋友花了4天时间才配置好)各种搜索.下载.安装配置,出问题等. 市面上的配置资料很多,选 ...

  8. python之OpenCv(四)---人脸识别

    对特定图像进行识别,最关键的是要有识别对象的特征文件.OpenCV已经内置了人脸识别特征文件,我们只要使用OpenCV的CascadeClassifier类即可进行识别. 语法: https://gi ...

  9. python基于OpenCV的人脸识别系统

    想获得所有的代码,请下载(来自我的CSDN): https://download.csdn.net/download/qq_40875849/11292912 主函数: from recognitio ...

随机推荐

  1. Django Ajax登录 防止CSRF

    什么是CSRF 维基百科: 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CS ...

  2. github for windows 使用

    先在github上申请账号,已有略过. 下载github for windows安装,可以提前安装.NET FRAMEWORK 4.0,否则它会在线下载安装.NET 4. 安装后登录账号,不要急着CL ...

  3. Android应用程序如何调用shell脚本(一)

    转自: Android应用程序如何调用shell脚本(一) 一般来说, Android 下的应用程序可以“直接”得到的最大的权限为 system ,但是如果我们需要在程序中执行某些需要 root 权限 ...

  4. 动态修改css 规则

    页面引用了两个样式表: <link href="css/mui.min.css" rel="stylesheet" /> <link href ...

  5. 基于jQuery的表单操作

    1,文本框的聚焦和失焦 在对文本框进行操作时,通常为了提升用户体验,是用户的操作得到及时的反馈,会在文本框获得焦点时,让其颜色改变,然后在失去焦点时恢复为原来的样式,一般情况下,我们可以通过css的伪 ...

  6. 1009 Product of Polynomials (25 分)

    1009 Product of Polynomials (25 分) This time, you are supposed to find A×B where A and B are two pol ...

  7. decorator的class方式

    class式的 Decorator decorator的class方式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 clas ...

  8. 使用promisify来流程化异步操作

    现代js包括nodejs中有很多函数都是异步执行的, 我们总是需要写一个回调函数并且作为最后以一个参数传入,而我希望的是能像写promise这样的回调 promise .then() .then() ...

  9. JavaScript中判断函数、变量是否存在

    转载:http://www.jb51.net/article/67551.htm 一.是否存在指定函数 function isExitsFunction(funcName) { try { if (t ...

  10. openssl - cookbook

    1.openssl 2.Testing 3.Best Practices last 1.openssl 1.1.Key and Cerificate Management Run a web serv ...