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 多线程应用介绍
Dec 19 Python
python 把数据 json格式输出的实例代码
Oct 31 Python
Python学习之Django的管理界面代码示例
Feb 10 Python
基于循环神经网络(RNN)的古诗生成器
Mar 26 Python
详解Python的hasattr() getattr() setattr() 函数使用方法
Jul 09 Python
python模糊图片过滤的方法
Dec 14 Python
Django REST framework视图的用法
Jan 16 Python
Python使用Slider组件实现调整曲线参数功能示例
Sep 06 Python
Python中的引用和拷贝实例解析
Nov 14 Python
解决pyCharm中 module 调用失败的问题
Feb 12 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
Jul 02 Python
Python开发五子棋小游戏
May 02 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
一个好用的分页函数
2006/11/16 PHP
PHP初学者常见问题集合 修正版(21问答)
2010/03/23 PHP
ThinkPHP文件上传实例教程
2014/08/22 PHP
使用array_map简单搞定PHP删除文件、删除目录
2014/10/29 PHP
24条货真价实的PHP代码优化技巧
2016/07/28 PHP
JS解析XML的实现代码
2009/11/12 Javascript
JavaScript高级程序设计 学习笔记 js高级技巧
2011/09/20 Javascript
JavaScript调用后台的三种方法实例
2013/10/17 Javascript
基于jQuery的图片不完全按比例自动缩小
2014/07/11 Javascript
浅谈JavaScript中Date(日期对象),Math对象
2015/02/05 Javascript
js操作css属性实现div层展开关闭效果的方法
2015/05/11 Javascript
C#中使用迭代器处理等待任务
2015/07/13 Javascript
JS实现仿腾讯微博无刷新删除微博效果代码
2015/10/16 Javascript
深入理解MVC中的时间js格式化
2016/05/19 Javascript
angularJS 指令封装回到顶部示例详解
2017/01/22 Javascript
Web纯前端“旭日图”实现元素周期表
2017/03/10 Javascript
AngularJS页面带参跳转及参数解析操作示例
2017/06/28 Javascript
NodeJS收发GET和POST请求的示例代码
2017/08/25 NodeJs
vue的diff算法知识点总结
2018/03/29 Javascript
jQuery实现条件搜索查询、实时取值及升降序排序的方法分析
2019/05/04 jQuery
微信小程序如何获取地址
2019/12/24 Javascript
[00:28]DOTA2北京网鱼队选拔赛
2015/04/08 DOTA
Python高级应用实例对比:高效计算大文件中的最长行的长度
2014/06/08 Python
Python读写Json涉及到中文的处理方法
2016/09/12 Python
Python 按比例获取样本数据或执行任务的实现代码
2020/12/03 Python
HTML5 用动画的表现形式装载图像
2016/03/08 HTML / CSS
html5利用canvas实现颜色容差抠图功能
2019/12/23 HTML / CSS
构造方法和其他方法的区别?怎么调用父类的构造方法
2013/09/22 面试题
《桃花心木》教学反思
2014/02/17 职场文书
大学生个人自荐信
2014/02/24 职场文书
教师教学评估方案
2014/05/09 职场文书
学雷锋感言
2015/08/03 职场文书
简历自我评价:教师师德表现自我评价
2019/04/24 职场文书
Nginx 502 Bad Gateway错误原因及解决方案
2021/03/31 Servers
HTML+JS实现在线朗读器
2022/02/15 Javascript
mysql的Buffer Pool存储及原理
2022/04/02 MySQL