Haar级联:

Haar特征:边缘特征,线性特征,中心环绕特征,对角线特征

这些特征组合为特征模板,特征模板里有白色和黑色矩形,模板特征即为白色矩形像素和减去黑色矩形像素和。

Haar 特征的提取简单说就是通过不断改变模版的大小、位置和类型,白色矩形区域像素和‘减 去’黑色矩形区域像素和,以得到每种类型模版的大量子特征。

Haar特征提取需要大量重复计算各个像素,因此使用积分图可以很好减少计算量。积分图将图像以线性时间初始化(仅第二次遍历图像时),并可以通过矩形区域 四个角的值,提供像素的总和

在此例中,如要知道ABCD面积,只需要将左上角作为基准,计算以下四部分面积,最后图3 - 图1 - 图2 - 图4即为ABCD面积

Haar 级联是一个基于 Haar 特征的级联分类器,级联分类器把弱分类器转换为强分类器

人脸识别流程:

人脸检测,图像采集:
加载人脸检测器
图像预处理(灰度化,直方图均衡化)
detectMultiscal识别
rectangle函数绘制矩形框
在原图截取人脸图像

人脸识别:
样本归一化
加载训练好的分类器
预测输入图像值
判断角色

人脸数据采集程序

注:单纯安装opencv-python没有包含人脸识别所使用函数,因为人脸识别函数还属于opencv测试版内容,稳定性还无法保证,因此没有放在常规发行版。要安装opencv-contrib-python

pip install opencv-contrib-python -i https://mirrors.aliyun.com/pypi/simple/

import cv2
import numpy as np
import osdef generate_img(dirname):face_cascade = cv2.CascadeClassifier('D:\\opencv\\data\\haarcascades\\haarcascade_frontalface_default.xml')if (not os.path.isdir(dirname)):os.makedirs(dirname)cap = cv2.VideoCapture(0)count = 0while True:ret,frame = cap.read()x,y = frame.shape[0:2]small_frame = cv2.resize(frame, (int(y/2), int(x/2)))result = small_frame.copy()gray = cv2.cvtColor(small_frame, cv2.COLOR_BGR2GRAY)faces = face_cascade.detectMultiScale(gray,1.3,5)for (x, y, w, h) in faces:result = cv2.rectangle(result, (x, y), (x + w, y + h), (255, 0, 0), 2)f = cv2.resize(gray[y: y + h, x: x + w], (200, 200))if count < 20:cv2.imwrite(dirname + '%s.pgm' % str(count), f)print(count)count += 1cv2.imshow('face', result)if cv2.waitKey(30) & 0xFF == ord('q'):breakcap.release()cv2.destroyAllWindows()if __name__ == '__main__':generate_img(".\\photos\\raine")

说明:
1 face_cascade = cv2.CascadeClassifier('D:\\opencv\\data\\haarcascades\\haarcascade_frontalface_default.xml')
引入opencv的人脸检测器。该程序参数路径为标记好的图片的xml文件,关于人脸图片的xml文件可以自己标记创建,也可以直接下载opencv官方库(https://github.com/opencv/opencv/tree/master/data/haarcascades)。这里引入其中一个xml文件路径(我用的是正脸照片文件)。注意windows里路径要使用 \ 而非 \ 。 因为 \ 为转义字符标注,使用 \ 为 \ 的转义字符。

2

ret,frame = cap.read()
x,y = frame.shape[0:2]
small_frame = cv2.resize(frame, (int(y/2), int(x/2)))
result = small_frame.copy()
gray = cv2.cvtColor(small_frame, cv2.COLOR_BGR2GRAY)

获取相机照片,缩放图片使长宽缩为一半,复制图片,转换图片为灰度图

3 faces = face_cascade.detectMultiScale(gray,1.3,5)
调用face_cascade对象识别人脸,参数:
1 image表示的是要检测的输入图像
2 objects表示检测到的人脸目标序列
3 scaleFactor表示每次图像尺寸减小的比例
4 minNeighbors表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸)
5 minSize为目标的最小尺寸
6 minSize为目标的最大尺寸

4

 for (x, y, w, h) in faces:result = cv2.rectangle(result, (x, y), (x + w, y + h), (255, 0, 0), 2)f = cv2.resize(gray[y: y + h, x: x + w], (200, 200))

用矩形框框出人脸。创建图像 f 为截取的人脸部分图片

5

if count < 20:cv2.imwrite(dirname + '%s.pgm' % str(count), f)print(count)count += 1

保存图片,count加一,count为20时停止保存
效果如下:

人脸识别
opencv有三种人脸识别方法:
1 Fisherfaces:PCA 衍生版本,更高级,速度更快
2 Eigenfaces:通过 PCA 处理,计算训练集相对于数据库发散程度,越小则数据库与检测 到人脸差别越小
3 Local Binary Pattern Histogram(LBPH):将人脸分成小单元,与模型对应单元比对,每 个比对区域产生一个直方图

人脸数据模型训练及识别

import os
import sys
import cv2
import numpy as np# search for face photos in the files
def read_images(path, sz = None):index = 0images, indexes = [], []names = []# find path for samplesfor root, dirs, files in os.walk(path): # transverse the pathfor subdirs in dirs:    # get files in the childrens in pathsubject_path = os.path.join(root, subdirs)for filename in os.listdir(subject_path):   # get each photostry:if (filename == ".directory"):continue# find the path for each photofilepath = os.path.join(subject_path, filename)im = cv2.imread(os.path.join(subject_path, filename), cv2.IMREAD_GRAYSCALE) # read face samples# negative samplesif (im is None):print("image" + filepath + "is None")# positive samplesif (sz is not None):    im = cv2.resize(im, sz)images.append(np.asarray(im, dtype = np.uint8))indexes.append(index)except:print("unexpected error")raise # throw an exceptionindex = index + 1names.append(subdirs)return [names, images, indexes]# detect and classify face images
def face_rec(read_dir):# get face samples[names, x, y] = read_images(read_dir, sz = (200, 200))y = np.asarray(y, dtype=np.int32)model = cv2.face_EigenFaceRecognizer.create() # create face classifier modelmodel.train(np.asarray(x), np.asarray(y))   # train model# create face detector modelface_cascade = cv2.CascadeClassifier('C:/Users/linli/Desktop/faceDetect/haarcascade_frontalface_default.xml')cap = cv2.VideoCapture(0)while True:# get gray imageret, frame = cap.read()x, y = frame.shape[0:2]small_frame = cv2.resize(frame, (int(y / 2), int(x / 2)))result = small_frame.copy()gray = cv2.cvtColor(small_frame, cv2.COLOR_BGR2GRAY)# find face in the video framefaces = face_cascade.detectMultiScale(gray, 1.3, 5)for (x, y, w, h) in faces:# mark the face with a rectangleresult = cv2.rectangle(result, (x, y), (x + w, y + h), (255, 0, 0), 2)roi = gray[x:x + w, y:y + h]centerX = int(x + w / 2)centerY = int(y + h / 2)result = cv2.circle(result, (centerX, centerY), 5, (0, 0, 255), -1)try:roi = cv2.resize(roi, (200,200), interpolation=cv2.INTER_LINEAR)[p_label, p_confidence] = model.predict(roi)    # predict the face identityprint(p_confidence)# showthe prediction in textcv2.putText(result, names[p_label], (x, y - 20), cv2.FONT_HERSHEY_SIMPLEX, 1, 255, 2)except:continuecv2.imshow("recognize_face", result)if cv2.waitKey(30) & 0xFF == ord('q'):breakcap.release()cv2.destroyAllWindows()if __name__ == "__main__":face_rec("./photos")

1 Python里os获取路径基本函数
os.path.join(String*):接受多个字符串为参数,将字符串连接为文件路径,如果出现以 / 开头的参数,路径从最后一个以 / 开头参数开始
os.listdir(path):参数为一个路径,返回该路径下所有文件和文件夹名称
os.walk(path):遍历选定路径文件夹,返回root,dirs,files。其中root为当前文件夹path的绝对路径,dirs为当前文件夹子文件夹,files为当前文件夹下文件

2 def read_images(path, sz = None):
该函数搜索文件夹里已有的人脸样本,得到一个路径(names)+图像(images)+序号(indexes)二维列表

3

model = cv2.face_EigenFaceRecognizer.create() # create face classifier model
model.train(np.asarray(x), np.asarray(y))   # train model

创建人脸分类对象并利用之前获得的人脸图片训练模型

4

faces = face_cascade.detectMultiScale(gray, 1.3, 5)

调用人脸识别模型,在视频画面中寻找人脸图像

5

roi = cv2.resize(roi, (200,200), interpolation=cv2.INTER_LINEAR)

Eigenfaces算法要求识别目标图像和样本图像大小一致,这里统一设为200*200

6

centerX = int(x + w / 2)
centerY = int(y + h / 2)
result = cv2.circle(result, (centerX, centerY), 5, (0, 0, 255), -1)

找到人脸中心并绘制圆
注:circle函数参数:图像,圆心,半径,颜色,线宽(负数代表填充)
圆心必须为int型

7

[p_label, p_confidence] = model.predict(roi)

获取预测结构,包括标签名称和置信区间

效果如下:

(项目笔记)opencv人脸识别相关推荐

  1. 【转】OpenCV人脸识别

    转自:https://blog.csdn.net/learning_tortosie/article/details/85121576 写在前面 这是Adrian Rosebrock博客的第二篇翻译, ...

  2. Python+OpenCV人脸识别签到考勤系统(新手入门)

    Python+OpenCV人脸识别签到考勤系统(新手入门) 前言 项目效果图 项目需要的环境 编译器 辅助开发QT-designer 项目配置 代码部分 核心代码 项目目录结构 后记 正式版改进 项目 ...

  3. OpenCV 人脸识别 源代码

    请直接查看原文 OpenCV 人脸识别 源代码 https://hotdog29.com/?p=553 在 2019年7月6日 上张贴 由 hotdog发表回复 opencv 人脸识别 在本教程中,您 ...

  4. WPF编程--OpenCV人脸识别

    目录 1. 环境 2. NuGet导入依赖 3. 创建WriteableBitmapHelper.cs类 4. 编辑MainWindow.xaml.cs 5. 编辑MainWindow.xaml 1. ...

  5. 项目总结:人脸识别签到系统

    人脸识别签到系统项目总结 第一部分:项目简介 实验室人脸识别签到系统 第二部分:项目系统架构设计 2.1业务架构 2.2 技术架构 基础设施:主要是GPU,基于CUDA的开发 学习框架:主要是Dlib ...

  6. OpenCV人脸识别文件haarcascade_frontalface_alt.xml

    写python项目的时候,因为使用到人脸识别,需要下载OpenCV人脸识别模型haarcascade_frontalface_alt.xml这个文件,网上找的网盘链接要么过期要么文件代码缺失一半,运行 ...

  7. opencv 全志_移植opencv人脸识别到全志A10开发板上 +linux3.0内核

    移植opencv人脸识别 libz:    zlib-1.2.3 libjpeg:   jpegsrc.v6b libpng:   libpng-1.2.18 libyasm:   yasm-0.7. ...

  8. python人脸照片分类_Python OpenCV 人脸识别(一)

    前面介绍了Numpy模块,下面再介绍一个OpenCV模块,就基于这两个库看一下当下很火的人工智能是如何实现的,我们介绍几个:人脸识别(当下非常火的).音视频操作等等.今天先介绍一下静态图片的人脸识别, ...

  9. 图像识别——(java)opencv(人脸识别简单实现)

    人脸识别 package com.acts.opencv.demo;import javax.servlet.http.HttpServletRequest; import javax.servlet ...

  10. python opencv人脸识别考勤系统的完整源码

    这篇文章主要介绍了python opencv人脸识别考勤系统的完整源码,本文给大家介绍的非常详细,希望对大家的学习或工作具有一定的参考借鉴价值. 代码如下: import wx import wx.g ...

最新文章

  1. ART的安装和简单使用
  2. python怎么用excel-Python使用xlwt模块操作Excel的方法详解
  3. 《机器人学经典教程》——2.2 控制论
  4. python随机发红包_python 微信红包随机金额
  5. Linux 中设置环境变量的三种方法
  6. (转)淘淘商城系列——商品搜索功能表现层实现
  7. java使用poi操作excel文件_使用 java apache poi 操作 excel xlsx 文件
  8. 试解析Tomcat运行原理(一)--- socket通讯
  9. sql 只要一个字段相同则只显示一条数据_数据库
  10. 更改MAC终端显示的主机名
  11. go php 框架,go框架 - Go语言中文网 - Golang中文社区
  12. android 手机 跑分榜,Android手机哪家强?安兔兔鲁大师榜单见分晓!
  13. IDEA做数据库操作时的一个莫名其妙的错误
  14. R语言做面板模型的豪斯曼检验
  15. icp许可证和edi许可证区别是什么?
  16. 与门,AND Gate
  17. Python之Split函数
  18. centos8在线文档编辑ONLYOFFICE安装
  19. Android硬件控制之USB连接
  20. 许石林:《赤壁》是《无极》的另一极

热门文章

  1. mapminmax()、zscore()数据归一化
  2. 深度学习面试题:计算机视觉训练技巧
  3. 在windows下编译gmplib并使用vs2010成功调用
  4. CI521支持读写A卡和B卡,PIN对PIN直接替换CV520和CI520,软硬件兼容
  5. 大数据可视化模板分享
  6. 一个专门下载全球气象站数据的网站(包括中国700多个站)
  7. 程序员的超大文件下载方法
  8. python爬贴吧回复内容_Python爬虫_获取贴吧内容
  9. 技嘉主板BIOS修改风扇转速设置详细教程
  10. 【时间之外】金融数据中心机房应对监管(最新出炉)