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使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
May 15 Python
Python爬虫代理IP池实现方法
Jan 05 Python
Python实现Mysql数据库连接池实例详解
Apr 11 Python
django模型层(model)进行建表、查询与删除的基础教程
Nov 21 Python
Python实现可自定义大小的截屏功能
Jan 20 Python
Django学习笔记之为Model添加Action
Apr 30 Python
对PyQt5中的菜单栏和工具栏实例详解
Jun 20 Python
pyqt5 使用cv2 显示图片,摄像头的实例
Jun 27 Python
在python中利用try..except来代替if..else的用法
Dec 19 Python
Python3爬虫中关于中文分词的详解
Jul 29 Python
Ubuntu权限不足无法创建文件夹解决方案
Nov 14 Python
matplotlib画混淆矩阵与正确率曲线的实例代码
Jun 01 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
DOTA2 1月28日更新:监管系统降临刀塔世界
2021/01/28 DOTA
PHP安全防范技巧分享
2011/11/03 PHP
关于PHP递归算法和应用方法介绍
2013/04/15 PHP
yii2简单使用less代替css示例
2017/03/10 PHP
用jquery来定位
2007/02/20 Javascript
使用onbeforeunload属性后的副作用
2007/03/08 Javascript
jQuery 使用手册(七)
2009/09/23 Javascript
Jquery中val()表单取值赋值的实例代码
2013/08/15 Javascript
javascript实现des解密加密全过程
2014/04/03 Javascript
给html超链接设置事件不使用href来完成跳
2014/04/20 Javascript
JavaScript中获取高度和宽度函数总结
2014/10/08 Javascript
JQuery radio(单选按钮)操作方法汇总
2015/04/15 Javascript
JS实现带鼠标效果的头像及文章列表代码
2015/09/27 Javascript
使用jquery提交form表单并自定义action的实现代码
2016/05/25 Javascript
JAVA Web实时消息后台服务器推送技术---GoEasy
2016/11/04 Javascript
JQuery异步提交表单与文件上传功能示例
2017/01/12 Javascript
Boostrap栅格系统与自己额外定义的媒体查询的冲突问题
2017/02/19 Javascript
JavaScript实现瀑布流图片效果
2017/06/30 Javascript
Electron整合React使用搭建开发环境的步骤详解
2020/06/07 Javascript
详细分析Node.js 多进程
2020/06/22 Javascript
zbar解码二维码和条形码示例
2014/02/07 Python
Python获取DLL和EXE文件版本号的方法
2015/03/10 Python
python中的编码知识整理汇总
2016/01/26 Python
python 获取网页编码方式实现代码
2017/03/11 Python
Python生成MD5值的两种方法实例分析
2019/04/26 Python
python实现接口并发测试脚本
2019/06/25 Python
Flask框架中request、请求钩子、上下文用法分析
2019/07/23 Python
详解Python修复遥感影像条带的两种方式
2020/02/23 Python
python中adb有什么功能
2020/06/07 Python
Python+OpenCV图像处理——实现轮廓发现
2020/10/23 Python
联想香港官方网站及网店:Lenovo香港
2018/04/13 全球购物
美术专业个人自我评价
2014/01/18 职场文书
服装采购员岗位职责
2014/03/15 职场文书
文明工地标语
2014/06/16 职场文书
个人合伙协议书范本
2014/10/14 职场文书
nginx location中多个if里面proxy_pass的方法
2021/03/31 Servers