更多python教程请到友情连接: 菜鸟教程https://www.piaodoo.com

初中毕业读什么技校 http://cntkd.net

茂名一技http://www.enechn.com

ppt制作教程步骤 http://www.tpyjn.cn

兴化论坛http://www.yimoge.cn

电白论坛 http://www.fcdzs.com

目录
  • 一。人脸检测和数据收集
  • 二.训练识别器
  • 三.人脸识别和显示

本文不涉及分类器、训练识别器等算法原理,仅包含对其应用(未来我也会写自己对机器学习算法原理的一些观点和了解)

首先我们需要知道的是利用现有框架做一个人脸识别系统并不难,然后就开始我们的系统开发吧。

我们的系统主要分为三个部分,然后我还会提出对补获图片不能添加中文的解决方案。我们需要完成的任务:1.人脸检测和数据收集2.训练识别器3.人脸识别和显示

在读此篇文章之前我相信你已经做了python环境部署和opencv模块的下载安装工作,现在我们还需要的模块是pillow(树莓派默认带有此模块,但如果你用的是win系统可能还需要另外安装,在终端输入pip install pillow即可),和opencv-contrib模块,cv2的face模块包含在内(当然我的Linux系统的树莓派貌似仍然默认包含了此模块,所以如果你是用的pc可能需要另外下载),以及最基本的numpy模块。

在开始写代码之前我们首先需要在当前运行目录中添加两个文件夹,dataset用于存放捕获到的人脸图像,方便后面训练识别器,trainer文件夹则存放了训练结果

一。人脸检测和数据收集

#数据采集
cam = cv2.VideoCapture(0)#补获图片
cam.set(3, 640) # set video width
cam.set(4, 480) # set video height
face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')#导入分类器
# For each person, enter one numeric face id
face_id = input('\n 输入用户id')
print("\n 数据采集中,请正视摄像头轻微扭转")
# Initialize individual sampling face count
count = 0
while(True):ret, img = cam.read()#ret为是否成功读取,是一个布尔值gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#转化为灰度图faces = face_detector.detectMultiScale(gray, 1.3, 5,minSize=(100,100))for (x,y,w,h) in faces:#此处faces是一个array数组或空的元组,原因我后面会分析cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2)count += 1# Save the captured image into the datasets foldercv2.imwrite("dataset/User." + str(face_id) + '.' + str(count) + ".jpg", gray[y:y+h,x:x+w])cv2.imshow('image', img)k = cv2.waitKey(100) & 0xff # Press 'ESC' for exiting videoif k == 27:breakelif count >= 10: # Take 10 face sample and stop videobreak
# Do a bit of cleanup
print("\n [INFO] Exiting Program and cleanup stuff")
cam.release()
cv2.destroyAllWindows()

在这一部分中我们完成了人脸的补获,并将其保存在了我们建立的dataset文件夹,并将每一个人的数据用特定的id表述,这样我们就能训练能识别不同人脸的识别器。cam.set这一步中第二个参数是图像的分辨率,640×480是opencv的默认分辨率,但其仍支持800×600且最大支持1280乘1024像素,即使你的摄像头最大允许分辨率远大于这个值,opencv貌似仍不会允许你使用。之后就是haar级联分类器的导入,在配置过程中,我们已经下载了opencv自带的分类器,你只需要在文件管理器中查找haarcascade_frontalface_default.xml这个文件即可,在这个文件所在的文件夹中有许多分类器,当然如果你要识别例如苹果香蕉等物体你可能需要训练新的分类器(这也很容易做到),本文讨论的是人脸识别,因此这里不再赘述,你可以选择用其绝对路径导入,当然你也可以像我一样将其复制到你当前目录中。然后进入循环,图片的读取->转灰度图,然后是使用你已经导入的分类器识别人脸并将其用方框标出,然后将方框内的图片储存入dataset文件夹中。值得一提的是,因为分类器的算法是很慢的,所以分类器本身就有减帧处理(即使这样我的树莓派带人脸识别系统仍然很吃力),所以faces应该是大部分时间都是空的元组,小部分时间是读取到的array数组,因此你需要特别注意缩进问题,不要让分类器本身的减帧影响你视频读取并显示的帧数。

二.训练识别器

import cv2
#训练器
import numpy as np
from PIL import Image
import os
# Path for face image database
path = 'dataset'
recognizer = cv2.face.LBPHFaceRecognizer_create()#识别器的导入
detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
# function to get the images and label data
def getImagesAndLabels(path):imagePaths = [os.path.join(path,f) for f in os.listdir(path)]#在这里os模块可以帮助我们很好的建立路径,建议可以先查看一下相关函数的使用方法。faceSamples=[]ids = []for imagePath in imagePaths:PIL_img = Image.open(imagePath).convert('L') #转化为灰度图img_numpy = np.array(PIL_img,'uint8')#转化为数组id = int(os.path.split(imagePath)[-1].split(".")[1])faces = detector.detectMultiScale(img_numpy)for (x,y,w,h) in faces:faceSamples.append(img_numpy[y:y+h,x:x+w])ids.append(id)return faceSamples,ids
print ("\n 训练数据中,请稍后")
faces,ids = getImagesAndLabels(path)
recognizer.train(faces, np.array(ids))
# Save the model into trainer/trainer.yml
recognizer.write('trainer/trainer.yml') # recognizer.save() worked on Mac, but not on Pi
# Print the numer of faces trained and end program
print("\n {0} 张脸训练完毕. 程序关闭".format(len(np.unique(ids))))

在这一步我们需要对识别器按照不同id分别训练并保存结果,并将结果汇总写入trainer文件夹中命名为trainer.yml。这个文件里就是训练好的识别器。

三.人脸识别和显示

# -*- coding: UTF-8 -*-
#识别器
import cv2
import numpy as np
import os
from PIL import Image, ImageFont, ImageDraw
path_to_ttf = 'C:\Windows\Fonts\Microsoft YaHei UI\msyh.ttc'#ttc文件是支持汉语的字体,稍后我会说明。
font1= ImageFont.truetype(path_to_ttf, size=20)
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer/trainer.yml')#读取识别器
cascadePath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath);
font = cv2.FONT_HERSHEY_SIMPLEX
#iniciate id counter
id = 0
# names related to ids: example ==> Marcelo: id=1, etc
names = ['None', '段林晨', 'Paula', 'Ilza', 'Z', 'W']#因为我们不会在人脸识别时只显示你的代号而是要显示你的具体信息。
cam = cv2.VideoCapture(0)
cam.set(3, 640) # set video widht
cam.set(4, 480) # set video height
#最小识别的脸的大小,在识别过程中,我们不会捕获到距离你很远的街上路人的信息,这会导致很多问题,因此我们只需要识别想参与识别的人,而设置最小人脸识别大小可以规避这一点
minW = 0.1*cam.get(3)
minH = 0.1*cam.get(4)
while True:ret, img =cam.read()gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)faces = faceCascade.detectMultiScale(gray,scaleFactor = 1.2,minNeighbors = 5,minSize = (int(minW), int(minH)),)#相关参数设置可以自行搜索for(x,y,w,h) in faces:cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)id, confidence = recognizer.predict(gray[y:y+h,x:x+w])# Check if confidence is less them 100 ==> "0" is perfect matchif (confidence < 100):id = names[id]confidence = " {0}%".format(round(100 - confidence))#confidence是置信度指数,等于100-概率,相信大家的概率统计一定比我优秀else:id = "未识别"confidence = " {0}%".format(round(100 - confidence))img=Image.fromarray(img)draw = ImageDraw.Draw(img)draw.text(xy=(x+5,y-5), text=str(id), font=font1,fill=(255,255,255))img=np.array(img)cv2.putText(img, str(confidence), (x+5,y+h-5), font, 1, (255,255,0), 1)cv2.imshow('camera',img)k = cv2.waitKey(10) & 0xff # Press 'ESC' for exiting videoif k == 27:break
# Do a bit of cleanup
print("\n [INFO] Exiting Program and cleanup stuff")
cam.release()
cv2.destroyAllWindows()

在这一步中,很遗憾的是cv2.putText函数并不支持汉语的应用,即你不能通过这个函数将汉语姓名显示在视频中,虽然你可能会有英文名或干脆用汉语拼音,但这个问题我们必须要解决。因此我们在这里引入了pillow模块,我们只需要使用img.draw功能在图片上先打出你的姓名,再进行cv2.putText函数就能很好的解决这个问题,但是比较麻烦的是这两个函数涉及到的图片类型是不一样的,因此我在代码中对img和array图像进行了转换,最终完成了人脸识别系统。

到此这篇关于基于opencv和pillow实现人脸识别系统(附demo)的文章就介绍到这了,更多相关opencv pillow实现人脸识别内容请搜索菜鸟教程www.piaodoo.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持菜鸟教程www.piaodoo.com!

基于opencv和pillow实现人脸识别系统(附demo)相关推荐

  1. 基于opencv和pillow实现人脸识别系统(附详细源代码)

    本文不涉及分类器.训练识别器等算法原理,仅包含对其应用(未来我也会写自己对机器学习算法原理的一些观点和了解) 首先我们需要知道的是利用现有框架做一个人脸识别系统并不难,然后就开始我们的系统开发吧. 我 ...

  2. python读取视频流做人脸识别_基于OpenCV和Keras实现人脸识别系列——二、使用OpenCV通过摄像头捕获实时视频并探测人脸、准备人脸数据...

    基于OpenCV和Keras实现人脸识别系列手记: 项目完整代码参见Github仓库. 本篇是上面这一系列手记的第二篇. 在Opencv初接触,图片的基本操作这篇手记中,我介绍了一些图片的基本操作,而 ...

  3. python人脸识别opencv_Python基于Opencv来快速实现人脸识别过程详解(完整版)

    前言 随着人工智能的日益火热,计算机视觉领域发展迅速,尤其在人脸识别或物体检测方向更为广泛,今天就为大家带来最基础的人脸识别基础,从一个个函数开始走进这个奥妙的世界. 首先看一下本实验需要的数据集,为 ...

  4. 基于MatLab的PCA降维人脸识别系统(超详细解说)

    (一)基于MatLab的PCA降维人脸识别系统 本次博客内容将详细介绍如何使用MatLab,进行PCA降维来识别人脸.内容参考张铮<精通MatLab数字图像处理与识别>.书中有些内容应该是 ...

  5. 基于PCA和SVM的人脸识别系统的设计与实现

      基于PCA和SVM的人脸识别系统的设计与实现 1.1 题目的主要研究内容 工作的主要描述 下载人脸数据集,将其划分为训练集和测试集,对所有数据进行pca降维,将经过降维的训练集特征向量送入svm进 ...

  6. 深度学习之基于opencv和CNN实现人脸识别

    这个项目在之前人工智能课设上做过,但是当时是划水用的别人的.最近自己实现了一下,基本功能可以实现,但是效果并不是很好.容易出现错误识别,或者更改了背景之后识别效果变差的现象.个人以为是数据选取的问题, ...

  7. 基于百度智能云的人脸识别系统

    演示视频: [人脸识别]没想到自己做个人脸识别软件居然这么简单! 树莓派人脸识别代码: from picamera.array import PiRGBArray from picamera impo ...

  8. opencv 人脸识别_Python学习:基于Opencv来快速实现人脸识别(完整版)

    随着人工智能的日益火热,计算机视觉领域发展迅速,尤其在人脸识别或物体检测方向更为广泛,今天就为大家带来最基础的人脸识别基础,从一个个函数开始走进这个奥妙的世界. 首先看一下本实验需要的数据集,为了简便 ...

  9. opencv python考勤_Python基于Opencv来快速实现人脸识别过程详解(完整版)

    前言 随着人工智能的日益火热,计算机视觉领域发展迅速,尤其在人脸识别或物体检测方向更为广泛,今天就为大家带来最基础的人脸识别基础,从一个个函数开始走进这个奥妙的世界. 首先看一下本实验需要的数据集,为 ...

最新文章

  1. Dockerfile springboot项目拿走即用,将yml配置文件从外部挂入容器
  2. Thymeleaf 学习笔记 (2)
  3. 【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)...
  4. AndroidStudio 3.4 自定义注解处理器不起作用
  5. 算法时间复杂度分析基础
  6. ML之Medicine:利用机器学习研发药物—《Machine Learning for Pharmaceutical Discovery and Synthesis Consortium》
  7. php代码实现对word文件的查找与替换,ThinkPHP5使用phpword实现文件模板字符替换
  8. python显示range_python中range如何输出
  9. C++内联函数(inline function)
  10. matlab中quat2angle,RPY_Euler_Quaternion_AngleAxis角度转化:Matlab、Python、Halc
  11. sqlserver oracle插件,SQLServer链接服务器至Oracle
  12. 用Fiddler调试localhost
  13. Windows Server 2016补丁更新机制
  14. Yii2性能优化之:缓存依赖
  15. YYF的一些简单配置 2016-10-13
  16. avr单片机动态数码管c语言,AVR单片机8位数码管显示的程序实现(两种方法介绍)...
  17. 支付宝对账单功能开发
  18. matlab生成的数值为inf,计算值时为Nan / inf
  19. node koa解析excel表格 .xlsx .xls
  20. matlab安装破解

热门文章

  1. Java数据库插入记录的语句-单引号-双引号values('username+'-'+password
  2. 使用FreeMarker导出固定格式word文档
  3. 研发人员的几个典型性格特征
  4. 生成二维码及微信长按识别二维码
  5. 机器人仿真控制(以ABB为例)
  6. 计算机职业生涯测评,皮纹检测职业版——职业生涯规划指南测评系统
  7. Android +kotlin Banner 轮播广告 获取后台数据
  8. 量化城市︱计算机视觉技术在街道品质量化评估中的应用
  9. 看到它,让我想起了帅出天际的精灵王子……
  10. 【⚠️windows删除文件夹抽风了⚠️】“错误0x80070091:目录不是空的”问题处理