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实现的石头剪子布代码分享
Aug 22 Python
菜鸟使用python实现正则检测密码合法性
Jan 05 Python
python实现红包裂变算法
Feb 16 Python
使用Python的Twisted框架构建非阻塞下载程序的实例教程
May 25 Python
使用python为mysql实现restful接口
Jan 05 Python
python 处理telnet返回的More,以及get想要的那个参数方法
Feb 14 Python
Python基础之函数的定义与使用示例
Mar 23 Python
Python基本数据结构之字典类型dict用法分析
Jun 08 Python
python数值基础知识浅析
Nov 19 Python
Pytorch 实现sobel算子的卷积操作详解
Jan 10 Python
Python基于pyecharts实现关联图绘制
Mar 27 Python
基于python实现可视化生成二维码工具
Jul 08 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网页木马一枚 附PHP木马的防范方法
2009/10/09 PHP
PHP合并数组+与array_merge的区别分析
2010/08/01 PHP
浅谈PHP与C#的值类型指向区别的详解
2013/05/21 PHP
php函数指定默认值方法的小例子
2013/12/04 PHP
Smarty模板学习笔记之Smarty简介
2014/05/20 PHP
PHP中PDO的事务处理分析
2016/04/07 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
2019/03/01 PHP
浅谈PHP匿名函数和闭包
2019/03/08 PHP
JavaScript判断两种格式的输入日期的正确性的代码
2007/03/25 Javascript
ASP.NET中使用后端代码注册脚本 生成JQUERY-EASYUI的界面错位的解决方法
2010/06/12 Javascript
js过滤HTML标签以及空格的思路及代码
2013/05/24 Javascript
js调用后台servlet方法实例
2013/06/09 Javascript
在vue.js中抽出公共代码的方法示例
2017/06/08 Javascript
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
解决vue 更改计算属性后select选中值不更改的问题
2018/03/02 Javascript
浅谈js中的attributes和Attribute的用法与区别
2020/07/16 Javascript
[53:20]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 VG vs OG
2018/04/03 DOTA
python之import机制详解
2014/07/03 Python
Python中创建字典的几种方法总结(推荐)
2017/04/27 Python
详解使用 pyenv 管理多个版本 python 环境
2017/10/19 Python
Python中修改字符串的四种方法
2018/11/02 Python
Python面向对象之类和对象实例详解
2018/12/10 Python
Python3.4学习笔记之列表、数组操作示例
2019/03/01 Python
Belle Maison倍美丛官网:日本千趣会旗下邮购网站
2016/07/22 全球购物
夏尔巴人登珠峰品牌:Sherpa Adventure Gear
2018/02/08 全球购物
.NET里面如何取得当前的屏幕分辨率
2012/12/06 面试题
导游实习生自荐书
2014/01/28 职场文书
创先争优活动方案
2014/02/12 职场文书
致100米运动员广播稿
2014/02/14 职场文书
党员违纪检讨书
2014/02/18 职场文书
2014年预备党员学习新党章思想汇报
2014/09/15 职场文书
综合办公室岗位职责
2015/04/11 职场文书
公司考勤管理制度
2015/08/04 职场文书
《平移和旋转》教学反思
2016/02/19 职场文书
分析JVM源码之Thread.interrupt系统级别线程打断
2021/06/29 Java/Android
Python使用DFA算法过滤内容敏感词
2022/04/22 Python