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中xrange用法分析
Apr 15 Python
Python搭建FTP服务器的方法示例
Jan 19 Python
python 编写简单网页服务器的实例
Jun 01 Python
python selenium执行所有测试用例并生成报告的方法
Feb 13 Python
Django使用 Bootstrap 样式修改书籍列表过程解析
Aug 09 Python
python 魔法函数实例及解析
Sep 25 Python
Python pip配置国内源的方法
Feb 14 Python
python序列类型种类详解
Feb 26 Python
python环境下安装opencv库的方法
Mar 05 Python
python使用re模块爬取豆瓣Top250电影
Oct 20 Python
Python经纬度坐标转换为距离及角度的实现
Nov 01 Python
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
Jun 29 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 生成唯一id的几种解决方法
2013/03/08 PHP
PHP中使用hidef扩展代替define提高性能
2015/04/09 PHP
php使用函数pathinfo()、parse_url()和basename()解析URL
2016/11/25 PHP
laravel5.6中的外键约束示例
2019/10/23 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
jQuery DOM操作小结与实例
2010/01/07 Javascript
js下通过getList函数实现分页效果的代码
2010/09/17 Javascript
ECMAScript6函数剩余参数(Rest Parameters)
2015/06/12 Javascript
Js制作点击输入框时默认文字消失的效果
2015/09/05 Javascript
让图片跳跃起来  javascript图片轮播特效
2016/02/16 Javascript
Html5+jQuery+CSS制作相册小记录
2016/12/30 Javascript
js中的触发事件对象event.srcElement与event.target详解
2017/03/15 Javascript
深入理解Angular4订阅(Subscribe)与取消
2017/11/22 Javascript
JS使用贪心算法解决找零问题示例
2017/11/27 Javascript
vue v-model实现自定义样式多选与单选功能
2018/07/05 Javascript
nodejs实现聊天机器人功能
2019/09/19 NodeJs
jQuery实现简易聊天框
2020/02/08 jQuery
JavaScript原生数组函数实例汇总
2020/10/14 Javascript
Python实现的多线程端口扫描工具分享
2015/01/21 Python
使用Python压缩和解压缩zip文件的教程
2015/05/06 Python
Python基础之getpass模块详细介绍
2017/08/10 Python
windows下安装Python的XlsxWriter模块方法
2018/05/03 Python
如何用Python实现简单的Markdown转换器
2018/07/16 Python
django框架自定义用户表操作示例
2018/08/07 Python
Python应用领域和就业形势分析总结
2019/05/14 Python
Python3.5以上版本lxml导入etree报错的解决方案
2019/06/26 Python
Django celery异步任务实现代码示例
2020/11/26 Python
详解Html5 监听拦截Android返回键方法
2018/04/18 HTML / CSS
vue 中 get / delete 传递数组参数方法
2021/03/23 Vue.js
大专生自荐信
2013/10/04 职场文书
汽车专业毕业生推荐信
2013/11/12 职场文书
协议书格式
2014/04/23 职场文书
敬老月活动总结
2014/08/28 职场文书
收入证明怎么写
2015/06/12 职场文书
《吃水不忘挖井人》教学反思
2016/02/22 职场文书
苹果可能正在打击不进行更新的 App
2022/04/24 数码科技