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在指定目录下查找gif文件的方法
May 04 Python
使用httplib模块来制作Python下HTTP客户端的方法
Jun 19 Python
python计算圆周率pi的方法
Jul 11 Python
python安装numpy&安装matplotlib& scipy的教程
Nov 02 Python
对python 各种删除文件失败的处理方式分享
Apr 24 Python
python3将视频流保存为本地视频文件
Jun 20 Python
python图形工具turtle绘制国际象棋棋盘
May 23 Python
python过滤中英文标点符号的实例代码
Jul 15 Python
python使用多线程编写tcp客户端程序
Sep 02 Python
Django用户登录与注册系统的实现示例
Jun 03 Python
如何完美的建立一个python项目
Oct 09 Python
使用pytorch实现线性回归
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
全国FM电台频率大全 - 20 广西省
2020/03/11 无线电
php学习之数据类型之间的转换代码
2011/05/29 PHP
如何用C语言编写PHP扩展的详解
2013/06/13 PHP
PHP获取当前url的具体方法全面解析
2013/11/26 PHP
去除php注释和去除空格函数分享
2014/03/13 PHP
PHP基于自增数据如何生成不重复的随机数示例
2017/05/19 PHP
phpStudy vscode 搭建debug调试的教程详解
2020/07/28 PHP
jQuery Div中加载其他页面的实现代码
2009/02/27 Javascript
struts2 jquery 打造无限层次的树
2009/10/23 Javascript
js修改table中Td的值(定义td的双击事件)
2013/01/10 Javascript
可在线编辑网页文字效果代码(单击)
2013/03/02 Javascript
jQuery中slideUp()方法用法分析
2014/12/24 Javascript
jquery实现的省市区三级联动
2015/04/02 Javascript
javascript实现点击提交按钮后显示loading的方法
2015/07/03 Javascript
在jQuery中使用$而避免跟其它库产生冲突的方法
2015/08/13 Javascript
JavaScript实现给按钮加上双重动作的方法
2015/08/14 Javascript
全国省市二级联动下拉菜单 js版
2016/05/10 Javascript
JS实现求数组起始项到终止项之和的方法【基于数组扩展函数】
2017/06/13 Javascript
Vue2.x通用编辑组件的封装及应用详解
2019/05/28 Javascript
JavaScript代码模拟鼠标自动点击事件示例
2020/08/07 Javascript
小程序组件传值和引入sass的方法(使用vant Weapp组件库)
2020/11/24 Javascript
跟老齐学Python之永远强大的函数
2014/09/14 Python
python对指定目录下文件进行批量重命名的方法
2015/04/18 Python
Python Django使用forms来实现评论功能
2016/08/17 Python
Python中函数参数匹配模型详解
2019/06/09 Python
Python Scrapy多页数据爬取实现过程解析
2020/06/12 Python
Python 中如何使用 virtualenv 管理虚拟环境
2021/01/21 Python
使用css3绘制出各种几何图形
2016/08/17 HTML / CSS
花园仓库建筑:Garden Buildings Direct
2018/02/16 全球购物
网络工程师的自我评价
2013/10/02 职场文书
校园新闻广播稿
2014/01/10 职场文书
高中物理教学反思
2014/02/08 职场文书
教师党员自我剖析材料
2014/09/29 职场文书
公司保洁员岗位职责
2015/02/13 职场文书
捐款通知怎么写
2015/04/24 职场文书
2015暑假社会调查报告
2015/07/13 职场文书