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实现从百度API获取天气的方法
Mar 11 Python
在Python中使用mongoengine操作MongoDB教程
Apr 24 Python
详解Django 中是否使用时区的区别
Jun 14 Python
Python面向对象基础入门之设置对象属性
Dec 11 Python
Python Datetime模块和Calendar模块用法实例分析
Apr 15 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
Jul 25 Python
python对验证码降噪的实现示例代码
Nov 12 Python
Python如何省略括号方法详解
Mar 21 Python
基于python实现破解滑动验证码过程解析
May 28 Python
Pytorch1.5.1版本安装的方法步骤
Dec 31 Python
Python实现图片指定位置加图片水印(附Pyinstaller打包exe)
Mar 04 Python
使用numpy实现矩阵的翻转(flip)与旋转
Jun 03 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学习 函数 课件
2008/06/15 PHP
PHP获取本周第一天和最后一天示例代码
2014/02/24 PHP
PHP生成网站桌面快捷方式代码分享
2014/10/11 PHP
php设计模式之单例模式用法经典示例分析
2019/09/20 PHP
popdiv
2006/07/14 Javascript
通过JAVASCRIPT读取ASP设定的COOKIE
2007/02/15 Javascript
js 刷新页面的代码小结 推荐
2010/04/02 Javascript
JavaScript中链式调用之研习
2011/04/07 Javascript
jquery ztree实现下拉树形框使用到了json数据
2014/05/14 Javascript
28个常用JavaScript方法集锦
2015/01/14 Javascript
javascript 动态修改css样式方法汇总(四种方法)
2015/08/27 Javascript
JS图片压缩(pc端和移动端都适用)
2017/01/12 Javascript
Angular在一个页面中使用两个ng-app的方法(二)
2017/02/20 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
2017/06/03 Javascript
vue cli2.0单页面title修改方法
2018/06/07 Javascript
详解如何在vue项目中使用lodop打印插件
2018/09/27 Javascript
详解vue项目打包步骤
2019/03/29 Javascript
在微信小程序中渲染HTML内容3种解决方案及分析与问题解决
2020/01/12 Javascript
npm ci命令的基本使用方法
2020/09/20 Javascript
python分割文件的常用方法
2014/11/01 Python
Python读写文件方法总结
2015/06/09 Python
python通过加号运算符操作列表的方法
2015/07/28 Python
微信跳一跳辅助python代码实现
2018/01/05 Python
python使用minimax算法实现五子棋
2019/07/29 Python
pytorch实现Tensor变量之间的转换
2020/02/17 Python
python中如何进行连乘计算
2020/05/28 Python
总结python 三种常见的内存泄漏场景
2020/11/20 Python
Europcar德国:全球汽车租赁领域的领导者
2018/08/15 全球购物
如何提高JDBC的性能
2013/04/30 面试题
应届大学生自荐信格式
2013/09/21 职场文书
房地产活动策划方案
2014/05/14 职场文书
2014年电工工作总结
2014/11/20 职场文书
五年级语文教学反思
2016/03/03 职场文书
python实现监听键盘
2021/04/26 Python
JS实现扫雷项目总结
2021/05/19 Javascript
详解CSS故障艺术
2021/05/25 HTML / CSS