文章目录

  • 先看一下效果
  • 采集人脸信息
  • 人脸识别
  • 以上源码

本文人脸识别检测具体是通过程序采集图像并进行训练,并且基于这些训练的图像对人脸进行动态识别。

人脸识别前所需要的人脸库可以通过两种方式获得:

  • 1.自己从视频获取图像
  • 2.从人脸数据库免费获得可用人脸图像,如ORL人脸库(包含40个人每人10张人脸,总共400张人脸),ORL人脸库中的每一张图像大小为92x112。若要对这些样本进行人脸识别必须要在包含人脸的样本图像上进行人脸识别。这里提供自己准备图像识别出自己的方法。

先看一下效果

人丑勿怪

采集人脸信息

通过摄像头采集人脸信息,10张以上即可,把图像大小调整为92x112,保存在一个指定的文件夹,文件名后缀为.png,方法如下:

# 采集人脸数据
def generator(data):'''打开摄像头,读取帧,检测该帧图像中的人脸,并进行剪切、缩放生成图片满足以下格式:1.灰度图,后缀为 .png2.图像大小相同params:data:指定生成的人脸数据的保存路径'''name = input('my name:')# 如果路径存在则删除路径path = os.path.join(data, name)if os.path.isdir(path):shutil.rmtree(path)# 创建文件夹os.mkdir(path)# 创建一个级联分类器face_casecade = cv2.CascadeClassifier('./haarcascade_frontalface_alt2.xml')# 打开摄像头camera = cv2.VideoCapture(0)cv2.namedWindow('Dynamic')# 计数count = 1while (True):# 读取一帧图像ret, frame = camera.read()if ret:# 转换为灰度图gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 人脸检测face = face_casecade.detectMultiScale(gray_img, 1.3, 5)for (x, y, w, h) in face:# 在原图上绘制矩形cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)# 调整图像大小new_frame = cv2.resize(frame[y:y + h, x:x + w], (92, 112))# 保存人脸cv2.imwrite('%s/%s.png' % (path, str(count)), new_frame)count += 1cv2.imshow('Dynamic', frame)# 按下q键退出if cv2.waitKey(100) & 0xff == ord('q'):breakcamera.release()cv2.destroyAllWindows()

此方法运行后会在指定的data路径下创建一个你输入的人名的文件夹用于存放采集到的图像,在这里我输入了wgs,结果如图:

人脸识别

OpenCV有3中人脸识别方法,分别基于三个不同算法,分别为Eigenfaces,Fisherfaces和Local Binary Pattern Histogram

这些方法都有类似的一个过程,即先对数据集进行训练,对图像或视频中的人脸进行分析,并且从两个方面确定:

  • 1.是否识别到对应的目标,
  • 2.识别到的目标的置信度,在实际中通过阈值进行筛选,置信度高于阈值的人脸将被丢弃

这里介绍一下利用特征脸即Eigenfaces进行人脸识别算法,特征脸法本质上就是PCA降维,基本思路是先把图像灰度化,转化为单通道,再将它首位相接转换为列向量,假设图像的大小是20*20的,那么这个向量就是400维,但是维度太高算法复杂度也会升高,所以需要降维,再使用简单排序即可,核心代码:

# 载入图像   读取ORL人脸数据库,准备训练数据
def LoadImages(data):'''加载图片数据用于训练params:data:训练数据所在的目录,要求图片尺寸一样ret:images:[m,height,width]  m为样本数,height为高,width为宽names:名字的集合labels:标签'''images = []names = []labels = []label = 0# 遍历所有文件夹for subdir in os.listdir(data):subpath = os.path.join(data, subdir)# print('path',subpath)# 判断文件夹是否存在if os.path.isdir(subpath):# 在每一个文件夹中存放着一个人的许多照片names.append(subdir)# 遍历文件夹中的图片文件for filename in os.listdir(subpath):imgpath = os.path.join(subpath, filename)img = cv2.imread(imgpath, cv2.IMREAD_COLOR)gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# cv2.imshow('1',img)# cv2.waitKey(0)images.append(gray_img)labels.append(label)label += 1images = np.asarray(images)# names=np.asarray(names)labels = np.asarray(labels)return images, labels, names# 检验训练结果
def FaceRec(data):# 加载训练的数据X, y, names = LoadImages(data)# print('x',X)model = cv2.face.EigenFaceRecognizer_create()model.train(X, y)# 打开摄像头camera = cv2.VideoCapture(0)cv2.namedWindow('Dynamic')# 创建级联分类器face_casecade = cv2.CascadeClassifier('./haarcascade_frontalface_alt2.xml')while (True):# 读取一帧图像# ret:图像是否读取成功# frame:该帧图像ret, frame = camera.read()# 判断图像是否读取成功# print('ret',ret)if ret:# 转换为灰度图gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 利用级联分类器鉴别人脸faces = face_casecade.detectMultiScale(gray_img, 1.3, 5)# 遍历每一帧图像,画出矩形for (x, y, w, h) in faces:frame = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)  # 蓝色roi_gray = gray_img[y:y + h, x:x + w]try:# 将图像转换为宽92 高112的图像# resize(原图像,目标大小,(插值方法)interpolation=,)roi_gray = cv2.resize(roi_gray, (92, 112), interpolation=cv2.INTER_LINEAR)params = model.predict(roi_gray)print('Label:%s,confidence:%.2f' % (params[0], params[1]))'''putText:给照片添加文字putText(输入图像,'所需添加的文字',左上角的坐标,字体,字体大小,颜色,字体粗细)'''cv2.putText(frame, names[params[0]], (x, y - 20), cv2.FONT_HERSHEY_SIMPLEX, 1, 255, 2)except:continuecv2.imshow('Dynamic', frame)# 按下q键退出if cv2.waitKey(100) & 0xff == ord('q'):breakcamera.release()cv2.destroyAllWindows()

在程序中,我们用cv2.face.EigenFaceRecognizer_create()创建人脸识别的模型,通过图像数组和对应标签数组来训练模型,该函数有两个重要的参数:

  • 1.保留主成分的数目
  • 2.指定的置信度阈值,为一个浮点型。

下面就是基本重复人脸检测的相关操作,通过检测到视频中的人脸进行人脸识别,有如下两个步骤:

  • 1.将检测到的人脸图像调整为92x112,即需要和训练的图像的尺寸相同
  • 2.调用predict()函数进行人脸预测,该函数会返回两个元素的数组,第一个是识别个体的标签,第二个是置信度,越小匹配度越高,0表示完全匹配,需要了解的是不同算法的置信度评分机制不同。

附上效果图

转载请注明出处

以上源码

# -*- coding: utf-8 -*-import cv2
import numpy as np
import os
import shutil# 采集自己的人脸数据
def generator(data):'''打开摄像头,读取帧,检测该帧图像中的人脸,并进行剪切、缩放生成图片满足以下格式:1.灰度图,后缀为 .png2.图像大小相同params:data:指定生成的人脸数据的保存路径'''name = input('my name:')# 如果路径存在则删除路径path = os.path.join(data, name)if os.path.isdir(path):shutil.rmtree(path)# 创建文件夹os.mkdir(path)# 创建一个级联分类器face_casecade = cv2.CascadeClassifier('./haarcascade_frontalface_alt2.xml')# 打开摄像头camera = cv2.VideoCapture(0)cv2.namedWindow('Dynamic')# 计数count = 1while (True):# 读取一帧图像ret, frame = camera.read()if ret:# 转换为灰度图gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 人脸检测face = face_casecade.detectMultiScale(gray_img, 1.3, 5)for (x, y, w, h) in face:# 在原图上绘制矩形cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)# 调整图像大小new_frame = cv2.resize(frame[y:y + h, x:x + w], (92, 112))# 保存人脸cv2.imwrite('%s/%s.png' % (path, str(count)), new_frame)count += 1cv2.imshow('Dynamic', frame)# 按下q键退出if cv2.waitKey(100) & 0xff == ord('q'):breakcamera.release()cv2.destroyAllWindows()# 载入图像   读取ORL人脸数据库,准备训练数据
def LoadImages(data):'''加载图片数据用于训练params:data:训练数据所在的目录,要求图片尺寸一样ret:images:[m,height,width]  m为样本数,height为高,width为宽names:名字的集合labels:标签'''images = []names = []labels = []label = 0# 遍历所有文件夹for subdir in os.listdir(data):subpath = os.path.join(data, subdir)# print('path',subpath)# 判断文件夹是否存在if os.path.isdir(subpath):# 在每一个文件夹中存放着一个人的许多照片names.append(subdir)# 遍历文件夹中的图片文件for filename in os.listdir(subpath):imgpath = os.path.join(subpath, filename)img = cv2.imread(imgpath, cv2.IMREAD_COLOR)gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# cv2.imshow('1',img)# cv2.waitKey(0)images.append(gray_img)labels.append(label)label += 1images = np.asarray(images)# names=np.asarray(names)labels = np.asarray(labels)return images, labels, names# 检验训练结果
def FaceRec(data):# 加载训练的数据X, y, names = LoadImages(data)# print('x',X)model = cv2.face.EigenFaceRecognizer_create()model.train(X, y)# 打开摄像头camera = cv2.VideoCapture(0)cv2.namedWindow('Dynamic')# 创建级联分类器face_casecade = cv2.CascadeClassifier('./haarcascade_frontalface_alt2.xml')while (True):# 读取一帧图像# ret:图像是否读取成功# frame:该帧图像ret, frame = camera.read()# 判断图像是否读取成功# print('ret',ret)if ret:# 转换为灰度图gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 利用级联分类器鉴别人脸faces = face_casecade.detectMultiScale(gray_img, 1.3, 5)# 遍历每一帧图像,画出矩形for (x, y, w, h) in faces:frame = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)  # 蓝色roi_gray = gray_img[y:y + h, x:x + w]try:# 将图像转换为宽92 高112的图像# resize(原图像,目标大小,(插值方法)interpolation=,)roi_gray = cv2.resize(roi_gray, (92, 112), interpolation=cv2.INTER_LINEAR)params = model.predict(roi_gray)print('Label:%s,confidence:%.2f' % (params[0], params[1]))'''putText:给照片添加文字putText(输入图像,'所需添加的文字',左上角的坐标,字体,字体大小,颜色,字体粗细)'''cv2.putText(frame, names[params[0]], (x, y - 20), cv2.FONT_HERSHEY_SIMPLEX, 1, 255, 2)except:continuecv2.imshow('Dynamic', frame)# 按下q键退出if cv2.waitKey(100) & 0xff == ord('q'):breakcamera.release()cv2.destroyAllWindows()if __name__ == '__main__':data = "H:/frac_renlian"# generator(data)FaceRec(data)

转载请注明出处

python + OpenCV 实现人脸检测(全网之最通俗易懂)相关推荐

  1. 基于python+opencv的人脸检测+

    人脸检测分为两种:一种是基于知识的,一种是基于深度学习的.深度不会学习 人脸识别属于目标检测,主要涉及两个方面: ①先对检测的物体进行概率统计,从而知道待检测对象的一些特征,建立其目标的检测模型 ②用 ...

  2. python+opencv摄像头人脸检测+代码注释

    比较简单直接上代码: #导入模块 import cv2 #摄像头 cap=cv2.VideoCapture('1.mp4')falg = 1 num = 1while(cap.isOpened()): ...

  3. Python+OpenCV进行人脸检测(调用笔记本摄像头)

    最近需要对研究生论文进行开题,我的方向定位为人工智能机器学习-计算机视觉这个方向,所以先做一些小东西来对自己的所选方向有一个大致熟悉! 首先我所用到的工具是 PyCharm+Python3.7.0+O ...

  4. Python图像处理,cv2模块,OpenCV实现人脸检测蔡徐坤

    前言 利用Python实现OpenCV实现人脸检测,废话不多说~ 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: cv2模块: 以及一些Python自带的模块. 环境搭建 ...

  5. 基于opencv的人脸检测与识别(python)(1)

    基于opencv的人脸检测与识别(python语言)(1) 人脸检测和识别技术就目前而言,已经相对成熟,各类算法层出不穷,这都归功于各位奋斗在一线的大佬的努力(站在巨人的肩膀上的感觉就是爽).本文是参 ...

  6. 使用OpenCV进行人脸检测和戴墨镜特效实战(附Python源码)

     需要源码和图片请点赞关注收藏后评论区留言私信~~~ 人脸识别是基于人的脸部特征信息进行身份识别的一种生物识别技术,也是计算机视觉重点发展的技术.机器学习算法诞生之后,计算机可以通过摄像头等输入设备自 ...

  7. Python人脸识别黑科技(二):教你使用python+Opencv完成人脸解锁

    继上一篇"Python人脸识别黑科技(一):50行代码运用Python+OpenCV实现人脸追踪+详细教程+快速入门+图像识",那么今天我们来讲关于使用python+opencv+ ...

  8. 【OpenCV实战】OpenCV实现人脸检测详解(含代码)

    OpenCV中有许多可以进行人脸.人眼检测的特征文件,今天我们利用OpenCV中自带的特征文件haarcascade_frontalface_default.xml来进行人脸检测. [OpenCV实战 ...

  9. 基于opencv实现人脸检测

    基于opencv实现人脸检测 opencv简述 opencv是一个开源的计算机视觉库,它有着C++,Python,Java等接口,支持Windows,Linux,Mac OS,IOS 和 Androi ...

最新文章

  1. 每日一笑 | 一个男人逐渐变心的过程
  2. linux-mysql忘记密码解决办法-适用5.76
  3. 五年级计算机教室使用记录,五年级班会记录.doc
  4. 【汇编优化】之CPUID获取x86处理器信息
  5. ERROR: Cannot uninstall ‘wrapt‘. It is a distutils installed project and thus we cannot accurately
  6. 绿联网卡转接mac设置_绿联外置网卡Mac os 11.0 Big Sur驱动方案来了
  7. VS代码格式化快捷键
  8. 中国全国行政代码、邮政编码、区号、名称、简称、经纬度 数据库
  9. 【竞赛笔记】飞思卡尔智能车竞赛
  10. 微信转发软件后缀_简单修改后缀让微信发送25M以上微信大视频
  11. Ubuntu 20安装微信3.0版本的方法 v2022
  12. 计算机专业毕设评阅人评语,毕业论文评阅人评语模板
  13. 关于outlook 保存的.msg文件打开一次之后不能再次打开的问题
  14. HTTPResponse
  15. 如何在局域网下建立共享文件夹?
  16. python基础语法测评_Python基础语法测评(A1卷)
  17. FIDL:Flutter与原生通讯的新姿势,不局限于基础数据类型
  18. Biomedical images dataset findings(1 Brain page)
  19. zznu 1068: 进制转换
  20. Excel文件导出list对象

热门文章

  1. 点赋科技:淘宝引流推广办法详解
  2. VS2017 OpenCV图像可视化插件Image Watch的安装与使用
  3. ajax 技术动态加载数据,jQuery结合Ajax实现动态加载数据【原创】
  4. BT3下无线破解实战
  5. 计算机硬件和软件基础知识,计算机基础知识(硬件和软件)
  6. 自行车和电动自行车上亚马逊标准有什么区别?UL2849,16CFR1512
  7. java毕业设计公务员网上报名系统mybatis+源码+调试部署+系统+数据库+lw
  8. 2019燕山大学程序设计新生赛(二)
  9. 李克华 云计算高级群: 292870151 195907286 交流:Hadoop、NoSQL、分布式、lucene、solr、nutch kafka入门:简介、使用场景、设计原理、主要配置及集群搭
  10. jquery阻止冒泡事件 模拟事件