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.5实现检测路由器流量并写入txt的方法实例
Dec 17 Python
django 2.0更新的10条注意事项总结
Jan 05 Python
python读取和保存图片5种方法对比
Sep 12 Python
Django之模型层多表操作的实现
Jan 08 Python
Python实现点阵字体读取与转换的方法
Jan 29 Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
May 13 Python
python之生产者消费者模型实现详解
Jul 27 Python
python正则表达式匹配IP代码实例
Dec 28 Python
代码总结Python2 和 Python3 字符串的区别
Jan 28 Python
如何通过python实现全排列
Feb 11 Python
python生成并处理uuid的实现方式
Mar 03 Python
详解Flask前后端分离项目案例
Jul 24 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
构建简单的Webmail系统
2006/10/09 PHP
解析Ubuntu下crontab命令的用法
2013/06/24 PHP
微信公众平台开发之配置与请求
2015/08/26 PHP
Yii2 rbac权限控制之菜单menu实例教程
2016/04/28 PHP
一种JavaScript的设计模式
2006/11/22 Javascript
Jquery Change与bind事件代码
2011/09/29 Javascript
jquery动态增加text元素以及删除文本内容实例代码
2013/07/01 Javascript
jQuery向上遍历DOM树之parents(),parent(),closest()之间的区别
2013/12/02 Javascript
JavaScript—window对象使用示例
2013/12/09 Javascript
js中的如何定位固定层的位置
2014/06/15 Javascript
原生JavaScript+LESS实现瀑布流
2014/12/12 Javascript
JavaScript中的比较操作符>、=、
2014/12/31 Javascript
NodeJs测试框架Mocha的安装与使用
2017/03/28 NodeJs
JS计算两个时间相差分钟数的方法示例
2018/01/10 Javascript
JavaScript遍历查找数组中最大值与最小值的方法示例
2019/05/24 Javascript
vue 子组件修改data或调用操作
2020/08/07 Javascript
Saltstack快速入门简单汇总
2016/03/01 Python
Python实现base64编码的图片保存到本地功能示例
2018/06/22 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
2019/07/19 Python
使用python写的opencv实时监测和解析二维码和条形码
2019/08/14 Python
Python GUI自动化实现绕过验证码登录
2020/01/10 Python
pytorch查看模型weight与grad方式
2020/06/24 Python
python redis存入字典序列化存储教程
2020/07/16 Python
浅谈html5之sse服务器发送事件EventSource介绍
2017/08/28 HTML / CSS
HealthElement海外旗舰店:新西兰大卖场
2018/02/23 全球购物
什么是属性访问器
2015/10/26 面试题
行政助理工作职责范本
2014/03/04 职场文书
优秀大学生求职自荐信范文
2014/04/19 职场文书
班干部竞选演讲稿
2014/04/24 职场文书
党的群众路线教育实践活动心得体会(企业)
2014/11/03 职场文书
2014小学数学教师个人工作总结
2014/12/18 职场文书
2015年支教教师工作总结
2015/07/22 职场文书
2015年计算机教学工作总结
2015/07/22 职场文书
2019销售早会主持词
2019/06/27 职场文书
Vue中使用import进行路由懒加载的原理分析
2022/04/01 Vue.js
win10输入法不见了只能打出字母怎么解决?
2022/08/05 数码科技