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的IDEL增加清屏功能实例
Jun 19 Python
django允许外部访问的实例讲解
May 14 Python
python 读取txt,json和hdf5文件的实例
Jun 05 Python
完美解决在oj中Python的循环输入问题
Jun 25 Python
Python 查看list中是否含有某元素的方法
Jun 27 Python
使用Python处理BAM的方法
Sep 28 Python
Python实现的读取文件内容并写入其他文件操作示例
Apr 09 Python
Python远程视频监控程序的实例代码
May 05 Python
详解pandas数据合并与重塑(pd.concat篇)
Jul 09 Python
python3使用GUI统计代码量
Sep 18 Python
windows下的pycharm安装及其设置中文菜单
Apr 23 Python
音频处理 windows10下python三方库librosa安装教程
Jun 20 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
PHP系统流量分析的程序
2006/10/09 PHP
php下实现在指定目录搜索指定类型文件的函数
2008/10/03 PHP
基于PHP静态类的原罪详解
2013/05/06 PHP
php验证邮箱和ip地址最简单方法汇总
2015/10/30 PHP
IE JS无提示关闭窗口不提示的方法
2010/04/29 Javascript
jquery lazyload延迟加载技术的实现原理分析
2011/01/24 Javascript
JS trim去空格的最佳实践
2011/10/30 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
Js 代码中,ajax请求地址后加随机数防止浏览器缓存的原因
2013/05/07 Javascript
JS(JQuery)操作Array的相关方法介绍
2014/02/11 Javascript
判断复选框是否被选中的两种方法
2014/06/04 Javascript
JavaScript中匿名、命名函数的性能测试
2014/09/04 Javascript
jQuery插件datepicker 日期连续选择
2015/06/12 Javascript
深入理解JavaScript中的箭头函数
2015/07/28 Javascript
如何使用Vuex+Vue.js构建单页应用
2016/10/27 Javascript
JQuery Dialog对话框 不能通过Esc关闭的原因分析及解决办法
2017/01/18 Javascript
基于nodejs的雪碧图制作工具的示例代码
2018/11/05 NodeJs
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
jQuery带控制按钮轮播图插件
2020/07/31 jQuery
在JavaScript中查找字符串中最长单词的三种方法(推荐)
2021/01/18 Javascript
python利用hook技术破解https的实例代码
2013/03/25 Python
Python 的 with 语句详解
2014/06/13 Python
Python数据结构与算法之图的基本实现及迭代器实例详解
2017/12/12 Python
python利用openpyxl拆分多个工作表的工作簿的方法
2019/09/27 Python
Python 调用有道翻译接口实现翻译
2020/03/02 Python
利用Python裁切tiff图像且读取tiff,shp文件的实例
2020/03/10 Python
俄罗斯园林植物网上商店:Garshinka
2020/07/16 全球购物
QA工程师岗位职责
2013/11/20 职场文书
银行服务感言
2014/03/01 职场文书
股权转让协议书
2014/04/12 职场文书
法语专业求职信
2014/07/20 职场文书
房屋租赁协议书(标准版)
2014/10/02 职场文书
2014高三学生考试作弊检讨书
2014/12/14 职场文书
离职感谢信
2015/01/21 职场文书
毕业实习证明范本
2015/06/16 职场文书
2016春季小学开学寄语
2015/12/03 职场文书