opencv实现简单人脸识别


Posted in Python onFebruary 19, 2021

对于opencv 它提供了许多已经练习好的模型可供使用,我们需要通过他们来进行人脸识别

参考了网上许多资料 

假设你已经配好了开发环境 ,在我之前的博客中由开发环境的配置。

项目代码结构:

opencv实现简单人脸识别

dataSet : 存储训练用的图片,他由data_gen生成,当然也可以修改代码由其他方式生成

haarcascade_frontalface_alt.xml  、 haarcascade_frontalface_default.xml: 用于人脸检测的haar分类器,网上普遍说第一个效果更好,第二个运行速度更快

data_gen.py:生成我们所需的数据

trainer.py: 训练数据集

train.yml: 由train.py生成的人脸识别模型,供后面的人脸识别使用

recognize.py:视频中的人脸识别

data_gen.py

连续拍20张照片当作训练数据,每个人建立一组数据

import cv2
 
detector = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
cap = cv2.VideoCapture(0)
sampleNum = 0
Id = input('enter your id: ')
 
while True:
 ret, img = cap.read()
 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 faces = detector.detectMultiScale(gray, 1.3, 5)
 for (x, y, w, h) in faces:
 cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
 
 # incrementing sample number
 sampleNum = sampleNum + 1
 # saving the captured face in the dataset folder
 cv2.imwrite("dataSet/User." + str(Id) + '.' + str(sampleNum) + ".jpg", gray[y:y + h, x:x + w]) #
 
 cv2.imshow('frame', img)
 # wait for 100 miliseconds
 if cv2.waitKey(100) & 0xFF == ord('q'):
 break
 # break if the sample number is morethan 20
 elif sampleNum > 20:
 break
 
cap.release()
cv2.destroyAllWindows()

train.py

训练数据

import cv2
import os
import numpy as np
from PIL import Image
 
# recognizer = cv2.createLBPHFaceRecognizer()
detector = cv2.CascadeClassifier("/Users/qiuchenglin/PycharmProjects/face_recognize/haarcascade_frontalface_alt.xml")
recognizer = cv2.face.LBPHFaceRecognizer_create()
 
 
def get_images_and_labels(path):
 image_paths = [os.path.join(path, f) for f in os.listdir(path)]
 face_samples = []
 ids = []
 
 for image_path in image_paths:
 image = Image.open(image_path).convert('L')
 image_np = np.array(image, 'uint8')
 if os.path.split(image_path)[-1].split(".")[-1] != 'jpg':
 continue
 image_id = int(os.path.split(image_path)[-1].split(".")[1])
 faces = detector.detectMultiScale(image_np)
 for (x, y, w, h) in faces:
 face_samples.append(image_np[y:y + h, x:x + w])
 ids.append(image_id)
 
 return face_samples, ids
 
 
Faces, Ids = get_images_and_labels('dataSet')
recognizer.train(Faces, np.array(Ids))
recognizer.save('trainner.yml')

recognize.py

下面就是根据训练好的模型进行人脸识别,根据之前生成数据的编号,可以填入相对应的人名,例如以下示例我训练了三组人的数据

import cv2
import numpy as np
 
recognizer = cv2.face.LBPHFaceRecognizer_create()
# recognizer = cv2.createLBPHFaceRecognizer() # in OpenCV 2
recognizer.read('/Users/qiuchenglin/PycharmProjects/face_recognize/trainner.yml')
# recognizer.load('trainner/trainner.yml') # in OpenCV 2
 
cascade_path = "/Users/qiuchenglin/PycharmProjects/face_recognize/haarcascade_frontalface_alt.xml"
face_cascade = cv2.CascadeClassifier(cascade_path)
cam = cv2.VideoCapture(0)
# font = cv2.cv.InitFont(cv2.cv.CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 1, 1) # in OpenCV 2
font = cv2.FONT_HERSHEY_SIMPLEX
 
while True:
 ret, im = cam.read()
 gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
 faces = face_cascade.detectMultiScale(gray, 1.2, 5)
 for (x, y, w, h) in faces:
 cv2.rectangle(im, (x - 50, y - 50), (x + w + 50, y + h + 50), (225, 0, 0), 2)
 img_id, conf = recognizer.predict(gray[y:y + h, x:x + w])
 if conf > 50:
 if img_id == 1:
 img_id = 'liuzb'
 elif img_id == 2:
 img_id = 'linqc'
 elif img_id == 3:
 img_id = 'keaibao'
 else:
 img_id = "Unknown"
 # cv2.cv.PutText(cv2.cv.fromarray(im), str(Id), (x, y + h), font, 255)
 cv2.putText(im, str(img_id), (x, y), font, 1, (0, 255, 0), 1)
 cv2.imshow('im', im)
 if cv2.waitKey(10) & 0xFF == ord('q'):
 break
 
cam.release()
cv2.destroyAllWindows()

简单的一个人脸识别就完成了,只能说准确率没有非常高。

之后想办法进行提高。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python程序设计入门(3)数组的使用
Jun 16 Python
Python使用redis pool的一种单例实现方式
Apr 16 Python
Python实现简单字典树的方法
Apr 29 Python
python简单读取大文件的方法
Jul 01 Python
Python实现的文本简单可逆加密算法示例
May 18 Python
Python冲顶大会 快来答题!
Jan 17 Python
python pandas 对时间序列文件处理的实例
Jun 22 Python
Python实现的绘制三维双螺旋线图形功能示例
Jun 23 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
Nov 18 Python
python实现几种归一化方法(Normalization Method)
Jul 31 Python
python manage.py runserver流程解析
Nov 08 Python
用OpenCV进行年龄和性别检测的实现示例
Jan 29 Python
Atom Python 配置Python3 解释器的方法
Aug 28 #Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
Aug 28 #Python
Numpy的简单用法小结
Aug 28 #Python
Python 通过截图匹配原图中的位置(opencv)实例
Aug 27 #Python
Python 转换文本编码实现解析
Aug 27 #Python
python-opencv获取二值图像轮廓及中心点坐标的代码
Aug 27 #Python
python定位xpath 节点位置的方法
Aug 27 #Python
You might like
德生9700DX电路分析
2021/03/02 无线电
一些常用的php函数
2006/12/06 PHP
深入PHP操作MongoDB的技术总结
2013/06/02 PHP
PHP之APC缓存详细介绍 apc模块安装
2014/01/13 PHP
php显示时间常用方法小结
2015/06/05 PHP
PHP+MariaDB数据库操作基本技巧备忘总结
2018/05/21 PHP
laravel 如何实现引入自己的函数或类库
2019/10/15 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码
2007/04/01 Javascript
推荐9款炫酷的基于jquery的页面特效
2014/12/07 Javascript
javascript等号运算符使用详解
2015/04/16 Javascript
javascript实现带下拉子菜单的导航菜单效果
2015/05/14 Javascript
针对BootStrap中tabs控件的美化和完善(推荐)
2016/07/06 Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
2016/11/22 Javascript
Vue数据驱动模拟实现4
2017/01/12 Javascript
基于pako.js实现gzip的压缩和解压功能示例
2017/06/13 Javascript
Angular4.x通过路由守卫进行路由重定向实现根据条件跳转到相应的页面(推荐)
2018/05/10 Javascript
详解vue配置后台接口方式
2019/03/29 Javascript
如何使用vue slot创建一个模态框的实例代码
2020/05/24 Javascript
echarts 使用formatter 修改鼠标悬浮事件信息操作
2020/07/20 Javascript
js实现简单的轮播图效果
2020/12/13 Javascript
使用Python的内建模块collections的教程
2015/04/28 Python
python删除过期log文件操作实例解析
2018/01/31 Python
python实现聊天小程序
2018/03/13 Python
在pandas多重索引multiIndex中选定指定索引的行方法
2018/11/16 Python
flask框架路由常用定义方式总结
2019/07/23 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
2020/01/20 Python
如何在pycharm中安装第三方包
2020/10/27 Python
15个Pythonic的代码示例(值得收藏)
2020/10/29 Python
CSS3中Transform动画属性用法详解
2016/07/04 HTML / CSS
HTML5+CSS3应用详解
2014/02/24 HTML / CSS
喜诗官方在线巧克力店:See’s Candies
2017/01/01 全球购物
以实惠的价格提供高品质的时尚:Newchic
2018/01/18 全球购物
公司授权委托书格式范文
2014/10/02 职场文书
2015年精神文明建设工作总结
2015/04/21 职场文书
Python实现智慧校园自动评教全新版
2021/06/18 Python