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之一个免费的实验室
Sep 14 Python
Python中暂存上传图片的方法
Feb 18 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
Aug 08 Python
Python列表推导式、字典推导式与集合推导式用法实例分析
Feb 07 Python
Python堆排序原理与实现方法详解
May 11 Python
pandas条件组合筛选和按范围筛选的示例代码
Aug 26 Python
python实现文法左递归的消除方法
May 22 Python
python 密码学示例——凯撒密码的实现
Sep 21 Python
Python collections模块的使用方法
Oct 09 Python
Python调用REST API接口的几种方式汇总
Oct 19 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
Dec 17 Python
Python调用SMTP服务自动发送Email的实现步骤
Feb 07 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
基于文本的访客签到簿
2006/10/09 PHP
一篇入门的php Class 文章
2007/04/04 PHP
php 数组的一个悲剧?
2011/05/11 PHP
php对csv文件的读取,写入,输出下载操作详解
2013/08/10 PHP
PHP图形操作之Jpgraph学习笔记
2015/12/25 PHP
thinkphp实现附件上传功能
2017/05/26 PHP
用js实现控制内容的向上向下滚动效果
2007/06/26 Javascript
jquery 注意事项与常用语法小结
2010/06/07 Javascript
使用JavaScript 实现各种跨域的方法
2013/05/08 Javascript
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
2013/09/29 Javascript
javascript使用location.search的示例
2013/11/05 Javascript
JS计算网页停留时间代码
2014/04/28 Javascript
微信小程序 教程之注册程序
2016/10/17 Javascript
jQuery简单实现遍历单选框的方法
2017/03/06 Javascript
angularJS开发注意事项
2018/05/26 Javascript
详解vue中使用微信jssdk
2019/04/19 Javascript
vue实现前台列表数据过滤搜索、分页效果
2019/05/28 Javascript
教你如何用Node实现API的转发(某音乐)
2019/09/20 Javascript
NUXT SSR初级入门笔记(小结)
2019/12/16 Javascript
vue+ElementUI 关闭对话框清空验证,清除form表单的操作
2020/08/06 Javascript
[43:51]2014 DOTA2国际邀请赛中国区预选赛 Dream Times VS TongFu
2014/05/22 DOTA
Python浅拷贝与深拷贝用法实例
2015/05/09 Python
Python面向对象编程中关于类和方法的学习笔记
2016/06/30 Python
深入学习Python中的上下文管理器与else块
2017/08/27 Python
Python生成器以及应用实例解析
2018/02/08 Python
python3.6使用urllib完成下载的实例
2018/12/19 Python
Python实现在Windows平台修改文件属性
2020/03/05 Python
Django配置跨域并开发测试接口
2020/11/04 Python
Linux如何修改文件和文件夹的权限
2012/06/27 面试题
校园学雷锋活动月总结
2014/03/09 职场文书
出生公证委托书
2014/04/03 职场文书
《我爱祖国》演讲稿1000字
2014/09/26 职场文书
小学教师年度个人总结
2015/02/05 职场文书
Django展示可视化图表的多种方式
2021/04/08 Python
Java 数据结构七大排序使用分析
2022/04/02 Java/Android