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

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

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

defgenerator(data):'''打开摄像头,读取帧,检测该帧图像中的人脸,并进行剪切、缩放

生成图片满足以下格式:

1.灰度图,后缀为 .png

2.图像大小相同

params:

data:指定生成的人脸数据的保存路径'''name=input('my name:')#如果路径存在则删除路径

path=os.path.join(data,name)ifos.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()ifret:#转换为灰度图

gray_img=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#人脸检测

face=face_casecade.detectMultiScale(gray_img,1.3,5)for (x,y,w,h) inface:#在原图上绘制矩形

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+=1cv2.imshow('Dynamic',frame)#按下q键退出

if cv2.waitKey(100) & 0xff==ord('q'):breakcamera.release()

cv2.destroyAllWindows()

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

2.人脸识别

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

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

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

#载入图像 读取ORL人脸数据库,准备训练数据

defLoadImages(data):'''加载图片数据用于训练

params:

data:训练数据所在的目录,要求图片尺寸一样

ret:

images:[m,height,width] m为样本数,height为高,width为宽

names:名字的集合

labels:标签'''images=[]

names=[]

labels=[]

label=0#遍历所有文件夹

for subdir inos.listdir(data):

subpath=os.path.join(data,subdir)#print('path',subpath)

#判断文件夹是否存在

ifos.path.isdir(subpath):#在每一个文件夹中存放着一个人的许多照片

names.append(subdir)#遍历文件夹中的图片文件

for filename inos.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+=1images=np.asarray(images)#names=np.asarray(names)

labels=np.asarray(labels)returnimages,labels,names#检验训练结果

defFaceRec(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)

ifret:#转换为灰度图

gray_img=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#利用级联分类器鉴别人脸

faces=face_casecade.detectMultiScale(gray_img,1.3,5)#遍历每一帧图像,画出矩形

for (x,y,w,h) infaces:

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:continuecv2.imshow('Dynamic',frame)#按下q键退出

if cv2.waitKey(100) & 0xff==ord('q'):breakcamera.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的库实现人脸识别'''

importcv2importnumpy as npimportosimportshutil#采集自己的人脸数据

defgenerator(data):'''打开摄像头,读取帧,检测该帧图像中的人脸,并进行剪切、缩放

生成图片满足以下格式:

1.灰度图,后缀为 .png

2.图像大小相同

params:

data:指定生成的人脸数据的保存路径'''name=input('my name:')#如果路径存在则删除路径

path=os.path.join(data,name)ifos.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()ifret:#转换为灰度图

gray_img=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#人脸检测

face=face_casecade.detectMultiScale(gray_img,1.3,5)for (x,y,w,h) inface:#在原图上绘制矩形

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+=1cv2.imshow('Dynamic',frame)#按下q键退出

if cv2.waitKey(100) & 0xff==ord('q'):breakcamera.release()

cv2.destroyAllWindows()#载入图像 读取ORL人脸数据库,准备训练数据

defLoadImages(data):'''加载图片数据用于训练

params:

data:训练数据所在的目录,要求图片尺寸一样

ret:

images:[m,height,width] m为样本数,height为高,width为宽

names:名字的集合

labels:标签'''images=[]

names=[]

labels=[]

label=0#遍历所有文件夹

for subdir inos.listdir(data):

subpath=os.path.join(data,subdir)#print('path',subpath)

#判断文件夹是否存在

ifos.path.isdir(subpath):#在每一个文件夹中存放着一个人的许多照片

names.append(subdir)#遍历文件夹中的图片文件

for filename inos.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+=1images=np.asarray(images)#names=np.asarray(names)

labels=np.asarray(labels)returnimages,labels,names#检验训练结果

defFaceRec(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)

ifret:#转换为灰度图

gray_img=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#利用级联分类器鉴别人脸

faces=face_casecade.detectMultiScale(gray_img,1.3,5)#遍历每一帧图像,画出矩形

for (x,y,w,h) infaces:

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:continuecv2.imshow('Dynamic',frame)#按下q键退出

if cv2.waitKey(100) & 0xff==ord('q'):breakcamera.release()

cv2.destroyAllWindows()if __name__=='__main__':

data='./face'

#generator(data)

FaceRec(data)

View Code

2018.10.28

python人脸识别opencv_python中使用Opencv进行人脸识别相关推荐

  1. JAVA tess 识别图中文字 已训练好 识别精准

    JAVA tess 识别图中文字 已训练好 识别精准 文章目录 JAVA tess 识别图中文字 已训练好 识别精准 一.添加依赖 二.下载更新好的中文语言包 chi_sim.traineddata, ...

  2. python表情识别程序_Python+Dlib+Opencv实现人脸采集并表情判别功能的代码

    一.dlib以及opencv-python库安装 介于我使用的是jupyter notebook,所以在安装dlib和opencv-python时是在 这个命令行安装的 dlib安装方法: 1.若可以 ...

  3. python人脸识别门禁_Python+Opencv+Tkinter指纹识别与人脸识别的门禁兼考勤(一)

    一.设计目标:旨在PC端上搭建一款具有指纹识别与人脸识别功能的门禁兼考勤系统.该系统同时具备普通用户模式.管理员模式与超级管理员模式,下面具体介绍每种模式下的功能. 1)普通用户模式 该模式可分为收集 ...

  4. python视频图片识别算法_python利用Opencv进行人脸识别(视频流+图片)

    首先:需要在在自己本地安装opencv具体步骤可以问度娘 如果从事于开发中的话建议用第三方的人脸识别(推荐阿里) 1.视频流中进行人脸识别 # -*- coding: utf-8 -*- import ...

  5. python如何实现图像中特定颜色的种类识别及特定颜色的占比代码

    使用Python实现图像中特定颜色的种类识别及特定颜色的占比代码,首先可以使用OpenCV库对图像进行处理,然后使用特定的函数来识别图像中特定颜色的种类,最后使用统计学方法来计算特定颜色在图像中的占比 ...

  6. Python图像处理,cv2模块,OpenCV实现人脸检测蔡徐坤

    前言 利用Python实现OpenCV实现人脸检测,废话不多说~ 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: cv2模块: 以及一些Python自带的模块. 环境搭建 ...

  7. python 如何识别字符串中的人名 ,如何识别一串拼音字符串以及韵母的提取 (一些方法整理)

    一.识别字符串中的人名或特定名词 笔者所用的是百度智能云提供的词法分析接口,它可以对字符串分词,并且能够识别句子中的人名,地名,等等.好,接下来教你们如何使用这个接口. 官网:https://clou ...

  8. python人脸识别门禁_Python+Opencv+Tkinter指纹识别与人脸识别的门禁兼考勤(二)

    一. 门禁考勤系统硬件设计 1 .硬件总体结构 PC端的intel处理器作为硬件平台的核心,是衡量系统能否达到标准的主要标志.本文结合考勤系统,采用intel i5处理器的PC与51单片机共同构建了门 ...

  9. python opencv人脸识别登录_python使用opencv进行人脸识别

    环境 ubuntu 12.04 LTS python 2.7.3 opencv 2.3.1-7 安装依赖 sudo apt-get install libopencv-* sudo apt-get i ...

最新文章

  1. jsp 使用base标签 没有作用_终于弄明白衣服上,使用前请移除的标签到底是什么,起什么作用...
  2. static class 静态类(Java)
  3. java数字不等于_java – 仅使用set中的数字查找等于或大于给定目标的总和
  4. 名企程序员被裁实录:早上还在改 Bug,晚上就成下岗工
  5. 看完这篇文章,我再也不怕面试官问「垃圾回收」了...
  6. iis php5.3配置,windows+IIS 环境下以Fastcgi方式配置php 5.3.3的方法
  7. 5G手机产业链将带动多少A股上市公司?
  8. python十大必备知识_python学习必备知识汇总
  9. 程序人生:半路转行再来学软件测试,能够成为大牛吗?
  10. 单词字符的one-hot编码
  11. 收入没有大幅增加,苹果提高手机价格影响销量
  12. 【经验】CCF CSP认证问题
  13. [Pytorch系列-24]:神经网络基础 - 单个无激活函数的神经元实现简单线性回归 - 1
  14. Gephi简单导入数据
  15. 51单片机入门——LED灯
  16. Marlin-1.1.3固件Configuration.h文件解析
  17. python实现选择题自动答题_答题辅助python代码实现
  18. paramiko的安装
  19. Facebook_Pop的使用指北
  20. 给某汉化联盟讲些历史故事

热门文章

  1. 圣诞节要来了,程序员女友用Python画圣诞树的浪漫代码作为最好的礼物
  2. 高德地图地理编码和逆地理编码,以及逆地理编码的时候如何去掉省、市、镇
  3. 假设有一段英文,其中有单独的字母I误写为i,请编写程序进行纠正。
  4. 计算机蓝屏代码0xc0000020,Win10打开软件提示“损坏的映像 错误0xc0000020”的解决方法...
  5. 几个重要的排列组合定理公式
  6. 软件测试网课笔记(持续更新)
  7. 自上而下面向能力的编程思想
  8. Python中文gbk编码输出报错
  9. 用python画漂亮的生日蛋糕_一步一步最简单的最漂亮的画蛋糕
  10. java实验报告(实验三)