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 过滤字符串的技巧,map与itertools.imap
Sep 06 Python
python正则表达式修复网站文章字体不统一的解决方法
Feb 21 Python
web.py在模板中输出美元符号的方法
Aug 26 Python
python实现数独算法实例
Jun 09 Python
Python读取键盘输入的2种方法
Jun 16 Python
Python探索之pLSA实现代码
Oct 25 Python
基于Python实现的微信好友数据分析
Feb 26 Python
Python Numpy:找到list中的np.nan值方法
Oct 30 Python
Python中查看变量的类型内存地址所占字节的大小
Jun 26 Python
Python3打包exe代码2种方法实例解析
Feb 17 Python
python 弧度与角度互转实例
Apr 15 Python
Python经常使用的一些内置函数
Apr 11 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批量删除数据库下指定前缀的表以prefix_为例
2014/08/24 PHP
PHP使用array_merge重新排列数组下标的方法
2015/07/22 PHP
PHP封装的字符串加密解密函数
2015/12/18 PHP
用php+ajax新建流程(请假、进货、出货等)
2017/06/11 PHP
Laravel中log无法写入问题的解决
2017/06/17 PHP
javascript在一段文字中的光标处插入其他文字
2007/08/26 Javascript
jquery 提示信息显示后自动消失的具体实现
2013/12/18 Javascript
自己使用js/jquery写的一个定制对话框控件
2014/05/02 Javascript
多个checkbox被选中时如何判断是否有自己想要的
2014/09/22 Javascript
JavaScript学习笔记之JS函数
2015/01/22 Javascript
jquery实现仿Flash的横向滑动菜单效果代码
2015/09/17 Javascript
谷歌Chrome浏览器扩展程序开发小记
2016/01/06 Javascript
nodejs微信公众号支付开发
2016/09/19 NodeJs
浅谈regExp的test方法取得的值变化的原因及处理方法
2017/03/01 Javascript
关于vue-router路径计算问题
2017/05/10 Javascript
JS获取数组中出现次数最多及第二多元素的方法
2017/10/27 Javascript
Angular项目从新建、打包到nginx部署全过程记录
2017/12/09 Javascript
在knockoutjs 上自己实现的flux(实例讲解)
2017/12/18 Javascript
Element-UI Table组件上添加列拖拽效果实现方法
2018/04/14 Javascript
微信小程序自定义底部导航带跳转功能
2018/11/27 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
[47:04]EG vs RNG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
python flask 多对多表查询功能
2017/06/25 Python
Python 中 -m 的典型用法、原理解析与发展演变
2019/11/11 Python
解决Numpy中sum函数求和结果维度的问题
2019/12/06 Python
Django用数据库表反向生成models类知识点详解
2020/03/25 Python
Python接口测试结果集实现封装比较
2020/05/01 Python
BIBLOO捷克:购买女装、男装、童装、鞋和配件
2017/01/27 全球购物
以色列的身体护理及家居香薰品牌:Sabon NYC
2018/02/23 全球购物
香港彩色隐形眼镜在线商店:Stunninglens(全球免费送货)
2019/05/10 全球购物
俄罗斯最大的隐形眼镜销售网站:Ochkov.Net
2021/02/07 全球购物
高中生毕业自我鉴定
2013/10/10 职场文书
受欢迎的大学生自我评价
2013/12/05 职场文书
大学生职业生涯规划书的基本内容
2014/01/06 职场文书
文化建设工作方案
2014/05/12 职场文书
Win11无法安装更新补丁KB3045316怎么办 附KB3045316补丁修复教程
2022/08/14 数码科技