目录

人脸检测和人脸识别

级联分类器

分析人脸位置

检测其他内容

眼睛检测

猫脸检测

人脸识别

Eigenfaces 人脸识别器

Fisherfaces 人脸识别器

Local Binary Pattern Histogram 人脸识别器

小结


人脸检测和人脸识别

人脸识别是基于人的脸部特征信息进行身份识别的一种生物识别技术,也是计算机视觉重点发展的技术。机器学习算法诞生之后,计算机可以通过摄像头等输入设备自动分析图像中包含的内容信息,随着技术的不断发展,现在已经有了多种人脸识别的算法。本章将介绍 OpenCV 自带的多种图像跟踪技术和 3 种人脸识别技术的用法。

级联分类器

将一系列简单的分类器按照一定顺序级联到一起就构成了级联分类器,使用级联分类器的程序可以通过一系列简单的判断来对样本进行识别。例如,依次满足「有 6 条腿」「有翅膀」「有头、胸、腹」这 3 个条件的样本就可以被初步判断为昆虫,但如果任何一个条件不满足,则不会被认为是昆虫。

不同版本的 OpenCV 自带的级联分类器 XML 文件可能会有差别,data 文件夹中缺少的 XML 文件可以到 OpenCV 的源码托管平台下载,地址为:https://github.com/opencv/opencv/tree/master/data/haarcascades。

每一个 XML 文件都对应一种级联分类器,但有些级联分类器的功能是类似的(正面人脸识别分类器就有 3 个),表 15.1 是部分 XML 文件对应的功能,

OpenCV 实现人脸检测需要做两步操作:加载级联分类器和使用分类器识别图像。这两步操作都有对应的方法。

首先是加载级联分类器,OpenCV 通过 CascadeClassifier()方法创建了分类器对象,其语法如下:

objects = cascade.detectMultiScale(image, scaleFactor, minNeighbors, flags, minSize, maxSize)

分析人脸位置

haarcascade_frontalface_default.xml 是检测正面人脸的级联分类器文件,加载该文件就可以创建出追踪正面人脸的分类器,调用分类器对象的 detectMultiScale()方法,得到的 objects 结果就是分析得出的人脸区域的坐标、宽和高。下面通过一个实例介绍如何实现此功能。

import cv2
image=cv2.imread('whuim/img.png')
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
faceCascade=cv2.CascadeClassifier('cascade/haarcascade_frontalface_alt.xml')
faces=faceCascade.detectMultiScale(image)
for(x,y,w,h) in faces:cv2.rectangle(image,(x,y),(x+w,y+h),(0,0,255),5)
cv2.imshow('img',image)
cv2.waitKey(0)
cv2.destroyAllWindows()

检测其他内容

OpenCV 提供的级联分类器除了可以识别人脸以外,还可以识别一些其他具有明显特征的物体,如眼睛、行人等。本节将介绍几个 OpenCV 自带的级联分类器的用法。

眼睛检测

haarcascade_eye.xml 是检测眼睛的级联分类器文件,加载该文件就可以追踪眼睛的分类器,下面通过一个实例来介绍如何实现此功能。

haarcascade_eye.xml 文件放到项目根目录下的 cascades 文件夹中,加载此级联分类器之后,检测出所有可能是眼睛的区域,通过 for 循环在这些区域上绘制红色边框,具体代码如下

import cv2
image=cv2.imread('whuim/img.png')
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
eyecascade=cv2.CascadeClassifier('C:/Users/whuim/PycharmProjects/pythonProject5/opencv/cascade\\haarcascade_eye.xml')
eyes=eyecascade.detectMultiScale(gray)
for(x,y,w,h) in eyes:cv2.rectangle(image,(x,y),(x+w,y+h),(0,0,255),5)
cv2.imshow('img',image)
cv2.waitKey(0)
cv2.destroyAllWindows()

猫脸检测

OpenCV 还提供了 2 个训练好的检测猫脸的级联分类器,分别是 haarcascade_frontalcatface.xml 和 haarcascade_frontalcatface_extended.xml,前者的判断标准比较高,较为精确,但可能有些猫脸识别不出来;后者的判断标准比较低,只要类似猫脸就会被认为是猫脸。使用猫脸分类器不仅可以判断猫脸的位置,还可以识别图像中有几只猫。

import cv2
image=cv2.imread('dog/img_2.png')
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
eyecascade=cv2.CascadeClassifier('C:\\Users\\whuim\\PycharmProjects\\pythonProject5\\opencv\\cascade\\haarcascade_frontalcatface_extended.xml')
eyes=eyecascade.detectMultiScale(gray)
for(x,y,w,h) in eyes:cv2.rectangle(image,(x,y),(x+w,y+h),(0,0,255),5)
cv2.imshow('img',image)
cv2.waitKey(0)
cv2.destroyAllWindows()

以上本应还有行人检测 车牌检测 但由于代码极其类似,就不一一展示了

人脸识别

OpenCV 提供了 3 种人脸识别方法,分别是 Eigenfaces、Fisherfaces 和 LBPH。这 3 种方法都是通过对比样本的特征最终实现人脸识别。因为这 3 种算法提取特征的方式不一样,侧重点不同,所以不能分出孰优孰劣,只能说每种方法都有各自的识别风格。

OpenCV 为每一种人脸识别方法都提供了创建识别器、训练识别器和识别 3 种方法,这 3 种方法的语法非常相似。本节将简单介绍如何使用这些方法。

Eigenfaces 人脸识别器

Eigenfaces 也叫作「特征脸」。Eigenfaces 通过 PCA(主成分分析)方法将人脸数据转换到另外一个空间维度做相似性计算。在计算过程中,算法可以忽略一些无关紧要的数据,仅识别一些具有代表性的特征数据,最后根据这些特征识别人脸。

开发者需要通过以下 3 种方法完成人脸识别操作。

(1)通过 cv2.face.EigenFaceRecognizer_create()方法创建 Eigenfaces 人脸识别器,其语法如下:

     recognizer = cv2.face.EigenFaceRecognizer_create(num_components, threshold)

训练识别器后可以通过识别器的 predict()方法识别人脸,该方法对比样本的特征,给出最相近的结果和评分,其语法如下:

 label, confidence = recognizer.predict(src)

import cv2
import numpy as np
photolist=list()
lables=list()
photolist.append(cv2.imread('whuim/whuim1.jpg',0))
lables.append(0)
photolist.append(cv2.imread('whuim/whuim2.jpg',0))
lables.append(0)
photolist.append(cv2.imread('whuim/whuim3.jpg',0))
lables.append(0)
recongizer=cv2.face.EigenFaceRecognizer_create()
recongizer.train(photolist,np.array(lables))
i=cv2.imread('whuim/whuim4.jpg')
lable,confidence=recongizer.predict(i)
print(confidence)

Fisherfaces 人脸识别器

Fisherfaces 是由 Ronald Fisher 最早提出的,这也是 Fisherfaces 名字的由来。Fisherfaces 通过 LDA(线性判别分析技术)方法将人脸数据转换到另外一个空间维度做投影计算,最后根据不同人脸数据的投影距离判断其相似度。

开发者需要通过以下 3 种方法完成人脸识别操作。

(1)通过 cv2.face.FisherFaceRecognizer_create()方法创建 Fisherfaces 人脸识别器,其语法如下:

     recognizer = cv2.face.FisherFaceRecognizer_create(num_components, threshold)

recognizer.train(src, labels)

Local Binary Pattern Histogram 人脸识别器

Local Binary Pattern Histogram 简称 LBPH,即局部二进制模式直方图,这是一种基于局部二进制模式算法,这种算法善于捕获局部纹理特征。

开发者需要通过以下 3 种方法来完成人脸识别操作。

(1)通过 cv2.face. LBPHFaceRecognizer_create()方法创建 LBPH 人脸识别器,其语法如下:

 recognizer = cv2.face.LBPHFaceRecognizer_create(radius, neighbors, grid_x, grid

小结

人脸检测和人脸识别是相辅相成的,这是因为在进行人脸识别前,要先判断当前图像内是否出现了人脸,这个判断过程需要由人脸检测完成。只有在当前图像内检测到人脸,才能判断出这张人脸属于哪个人,这个判断是由人脸识别器完成的。因此,人脸识别指的是程序先在图像内检测人脸,再识别这张人脸属于哪个人的过程。本章讲解了 3 种人脸识别器,读者要熟练掌握这 3 种人脸识别器的实现方法和实现原理。

opencv从入门到精通11相关推荐

  1. springtboot 引用子工程的文件_xmake从入门到精通11:如何组织构建大型工程

    xmake是一个基于Lua的轻量级现代化c/c++的项目构建工具,主要特点是:语法简单易上手,提供更加可读的项目维护,实现跨平台行为一致的构建体验. 本文主要详细讲解下,如何通过配置子工程模块,来组织 ...

  2. opencv从入门到精通 哦吼02

    目录 使用 NumPy 模块操作像素 NumPy 概述 数组的类型 创建数组 操作数组 切片操作就不学了python笔记中已提 创建图像 黑中有白 斑点图 拼接图像 色彩空间与通道 色彩空间 GRAY ...

  3. opencv从入门到精通(2)--简单图像变换

    1.图像滤波 这里有到两个函数cvCreateImage和 cvSmooth( image, out, CV_GAUSSIAN, 5,5,0,0 ). cvCreateImage(cvGetSize( ...

  4. OpenCV从入门到精通——边缘检测算法Canny

    Canny 算法 边缘:我的理解是在图像处理的过程中,针对我们图像处理的过程中,梯度变化以较大的地方能够让我们能够快速辨识,针对一个人脸,脸上有一些平滑的地方(没错我针对美颜的),与头发的接壤处,会让 ...

  5. Opencv从入门到精通(五):透视图、拼接图片、颜色检测

    文章目录 一.透视图 二.拼接图片 三.颜色检测 一.透视图 二.拼接图片 实际上操作的是像素点矩阵 import cv2 import numpy as npimg = cv2.imread('1. ...

  6. ARKit从入门到精通(11)-ARKit开发常见问题及解决方案

    转载请注明出处:ARKit从入门到精通(11)-ARKit开发常见问题及解决方案 本文主要介绍ARKit开发过程中一些常见问题 1.ARKit框架无法导入问题 2.ARKit运行黑屏或者白屏问题:Un ...

  7. 《51单片机应用开发从入门到精通》——2.11 歌曲演奏实例

    本节书摘来异步社区<51单片机应用开发从入门到精通>一书中的第2章,第2.11节,作者:张华杰 ,更多章节内容可以访问云栖社区"异步社区"公众号查看 2.11 歌曲演奏 ...

  8. java从入门到精通_想要开始学java?你要的java从入门到精通布列如下!

    java从入门到精通,让我来告诉你! 毫无疑问,java是当下最火的编程语言之一.对于许多未曾涉足计算机编程的领域「小白」来说,深入地掌握java看似是一件十分困难的事.其实,只要掌握了科学的学习方法 ...

  9. 七夕福利 | 3D视觉从入门到精通系统学习教程

    写在前面 首先提前祝大家七夕快乐,感谢大家对工坊的陪伴与支持! 今天是七夕福利活动的最后一天,共100张券,已经送出去了60多张,还剩不到35张,大家可以抓住本次的活动机会,享受全年的最低价(优惠了7 ...

最新文章

  1. 【python】一个目录里面多个python程序文件,统计一下里面有多少行代码。即分别列出:代码、空行、注释的行数。
  2. Django框架之跨站请求伪造
  3. buuctf 基础破解
  4. Divide by three, multiply by two CodeForces - 977D (思维排序)
  5. 从独角兽到上市:我们与TAPD的故事
  6. java递归算法实现
  7. Bluetooth LE(低功耗蓝牙) - 第一部分
  8. SSH软件包:Sftp,scp和ssh-agent
  9. mysql系列之6--------使用第三方工具-percona来备份mysql和恢复
  10. User-Agent 及其构造
  11. Android安全防护之旅---Android应用反调试操作的几种方案解析
  12. 在ASP.NET中运用JavaScript重定向页面
  13. sillyGirl拉库部署+oicq+screen稳定运行完整教程。
  14. 天猫魔盒1代TMB100E刷机, 以及右声道无声的问题
  15. FastStone Capture—屏幕录像
  16. TranslateAnimation 使用详解
  17. HTML制作qq空间主页
  18. 程序之外_与我长跑十年的女朋友嫁人了(转)
  19. 【摩斯电码】我是如何通过一张小纸条渗透进了妹子的心
  20. 个子矮s弯如何看点打方向图解_科目二s弯怎么看点打方向技巧图解

热门文章

  1. 惠普HP LaserJet Pro 400-M401d 打印机打印出的纸出现雨水滴在玻璃的现象!!
  2. java把mysql大数据量表每个文件最多10MB分批次写入到txt文件中
  3. SAP 通过SPRO激活扩展BC集失败
  4. MySQL中IN、ALL、ANY、SOME的解释
  5. 银行现金柜员尾箱管理
  6. java反序列化漏洞挖掘
  7. 群控,云控:资料整理
  8. 结构化数据与非结构数据、监督学习与非监督学习、标记与无标记
  9. CG动画制作项目第四篇:镜头的运用以及画面的布局
  10. 矩阵分析理论在实际工程中的应用_ProNas-振动噪声工程界新一代的前沿技术