人脸检测是指在图像中完成人脸定位的过程,而人脸识别是在人脸检测的基础上进一步判断人的身份,OpenCV提供了三种人脸识别的方法:EigenFaces(特征脸)、FisherFaces(人鱼脸)、Local Binary Patterns Histograms,LBPH(局部二进制编码直方图)。

1、EigenFaces

EigenFaces人脸识别的基本步骤:

(1)调用cv2.face.EigenFaceRecognizer_create()方法创建EigenFaces识别器;

(2)调用识别器的train()方法以便使用已知图像训练模型;

(3)调用识别器的predict()方法以便使用未知图像进行识别,确认其身份。

用到的函数:

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

参数说明:recognizer为返回的EigenFaces识别器对象

num_components为分析时的分量个数,默认为0,表示根据实际输入决定

threshold为人脸识别时采用的阈值

recognizer.train(src, labels)

参数说明:src为用于训练的已知图像数组

labels为标签数组,与已知图像数组中的人脸一一对应,同一个人的人脸标签应设置为相同值

label, confidence = recognizer.predict(testimg)参数说明:testimg为未知人脸图像

label为返回的标签值

confidence为返回的可信度,表示未知人脸和模型中已知人脸之间的距离,0表示完全匹配,低于5000可认为是可靠的匹配结果

代码如下:

import cv2
import numpy as np
img1 = cv2.imread('xxx', 0)
img2 = cv2.imread('xxx', 0)
img3 = cv2.imread('xxx', 0)
img4 = cv2.imread('xxx', 0)
img5 = cv2.imread('xxx', 0)
img1 = cv2.resize(img1, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)
img2 = cv2.resize(img2, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)
img3 = cv2.resize(img3, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)
img4 = cv2.resize(img4, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)
img5 = cv2.resize(img5, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)
# 创建训练图像数组
train_images = [img1, img2, img3, img4, img5]
# 创建标签数组,表示训练图像数组中人脸的身份
labels = np.array([1, 2, 3, 4, 5])
# 创建EigenFaces识别器
recognizer = cv2.face.EigenFaceRecognizer_create()
# 执行训练操作
recognizer.train(train_images, labels)
# 打开测试图像
testimg = cv2.imread('xxx', 0)
testimg = cv2.resize(testimg, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)
# 识别人脸
label, confidence = recognizer.predict(testimg)
# 输出识别结果
print('匹配标签:', label)
print('可信度:', confidence)

注意:读取图像时必须转换为灰度图;

所有的用于训练的已知人脸图像和用于测试的未知人脸图像的尺寸必须一致(程序中已体现这一点,可以根据自己的实际和需要设置尺寸);

recognizer = cv2.face.EigenFaceRecognizer_create()函数中的face来自于OpenCV的贡献库,所以需要安装opencv-contrib-python,并且要与opencv-python的版本一致,否则程序会报错。

下面分别是用与训练图像数组完全一样和完全不一样的图片下的结果:

2、FisherFaces

FisherFaces人脸识别的基本步骤:

(1)调用cv2.face.FisherFaceRecognizer_create()方法创建FisherFaces识别器;

(2)调用识别器的train()方法以便使用已知图像训练模型;

(3)调用识别器的predict()方法以便使用未知图像进行识别,确认其身份。

代码与EigenFaces类似,只要将创建识别器

recognizer=cv2.face.EigenFaceRecognizer_create()改为recognizer=cv2.face.FisherFaceRecognizer_create()即可。

3、LBPH

LBPH算法处理图像的基本原理:

取像素x周围(邻域)的8个像素与其比较,像素值比像素x大的取0,否则取1。将8个像素对应的0、1连接得到一个8为二进制数,将其转换为十进制数,作为像素x的LBP值;

对图像的所有像素按相同的方法进行处理,得到整个图像的LBP图像,该图像的直方图就是图像的LBPH。

LBPH人脸识别的基本步骤:

(1)调用cv2.face.LBPHFaceRecognizer_create()方法创建LBPH识别器;

(2)调用识别器的train()方法以便使用已知图像训练模型;

(3)调用识别器的predict()方法以便使用未知图像进行识别,确认其身份。

用到的函数:

recognizer=cv2.face.LBPHFaceRecognizer_create([,radius[,neighbors[,grid_x[,grid_y[,threshold]]]]])

参数说明:recognizer为返回的LBPH识别器对象

radius为邻域的半径大小

neighbors为邻域内像素点的数量,默认为8

grid_x为将LBP图像划分为多个单元格时,水平方向上的单元格数量,默认为8

grid_x为将LBP图像划分为多个单元格时,垂直方向上的单元格数量,默认为8

threshold为人脸识别时采用的阈值

recognizer.train(src, labels)

参数说明:src为用于训练的已知图像数组

labels为标签数组,与已知图像数组中的人脸一一对应,同一个人的人脸标签应设置为相同值

label, confidence = recognizer.predict(testimg)参数说明:testimg为未知人脸图像

label为返回的标签值

confidence为返回的可信度,表示未知人脸和模型中已知人脸之间的距离,0表示完全匹配,低于50可认为是可靠的匹配结果

代码实现:

import cv2
import numpy as np
img1 = cv2.imread('xxx', 0)
img2 = cv2.imread('xxx', 0)
img3 = cv2.imread('xxx', 0)
img4 = cv2.imread('xxx', 0)
img5 = cv2.imread('xxx', 0)
#
img1 = cv2.resize(img1, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)
img2 = cv2.resize(img2, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)
img3 = cv2.resize(img3, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)
img4 = cv2.resize(img4, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)
img5 = cv2.resize(img5, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)
# 创建训练图像数组
train_images = [img1, img2, img3, img4, img5]
# 创建标签数组,表示训练图像数组中人脸的身份
labels = np.array([1, 2, 3, 4, 5])
# 创建EigenFaces识别器
recognizer = cv2.face.LBPHFaceRecognizer_create()
# 执行训练操作
recognizer.train(train_images, labels)
# 打开测试图像
testimg = cv2.imread('xxx', 0)
testimg = cv2.resize(testimg, dsize=(200, 200), interpolation=cv2.INTER_NEAREST)
# 识别人脸
label, confidence = recognizer.predict(testimg)
# 输出识别结果
print('匹配标签:', label)
print('可信度:', confidence)

计算机视觉与图像处理学习笔记之人脸识别的三种方法相关推荐

  1. 使用OpenCV进行人脸识别的三种方法

    1 简介 OpenCV从版本2.4开始,加入了一个类FaceRecognizer,使用它可以方便的地进行人脸识别(源代码,在OpenCV的opencv\modules\contrib\doc\face ...

  2. Java学习笔记:创建线程的两种方法

    Java学习笔记:创建线程的两种方法 一.预备工作 1.创建Maven项目ThreadDemo 2.在pom.xml里添加依赖 二.继承Thread类创建子线程

  3. 学习笔记TF058:人脸识别

    人脸识别,基于人脸部特征信息识别身份的生物识别技术.摄像机.摄像头采集人脸图像或视频流,自动检测.跟踪图像中人脸,做脸部相关技术处理,人脸检测.人脸关键点检测.人脸验证等.<麻省理工科技评论&g ...

  4. 使用OpenCV进行人脸识别的三种算法(官方网翻译)

    怎样使用OpenCV进行人脸识别 本文大部分来自OpenCV官网上的Face Reconition with OpenCV这节内容(http://docs.opencv.org/modules/con ...

  5. 吴恩达深度学习笔记(105)-人脸识别之面部验证与二分类

    https://www.toutiao.com/a6652895489354105351/ 面部验证与二分类(Face verification and binary classification) ...

  6. mongo学习笔记四:Mongodb的三种集群(Replica Set)

    Replica Set    中文翻译叫做副本集,不过我并不喜欢把英文翻译成中文,总是感觉怪怪的.其实简单来说就是集群当中包含了多份数据,保证主节点挂掉了,备节点能继续提供数据服务,提供的前提就是数据 ...

  7. 监督学习:KNN(K-近邻)算法实现手写数字识别的三种方法

    没人会看的开场白:本来觉得自己从数据建模转人工智能方向应该问题不大(自我感觉自己算法学的不错).结果一个K-邻近实现手写数字识别的代码就让我改了三四天.虽然网上这方面的代码是很多,但是我运行了好几个, ...

  8. 学习笔记---取得枚举项的2种方法: Enum.GetValues()-Array.GetValue()和Enum.GetNames()-Enum.Parse()...

    代码 namespace EnumDemo { public enum Color { red = 0, orange =1, yellow =2, green=4, blue =5, cyan =6 ...

  9. 【C语言学习笔记】字符串拼接的3种方法 .

    昨天晚上和@buptpatriot讨论函数返回指针(malloc生成的)的问题,提到字符串拼接,做个总结. [cpp] view plaincopyprint? #include<stdio.h ...

最新文章

  1. TaxonKit工具:获取物种NCBI数据库的Taxonomy ID
  2. 交叉编译并移植opencv3.0.0到arm板
  3. 基于Vmware player的Windows 10 IoT core + RaspberryPi2安装部署
  4. mysql主从维护_mysql主从日常管理维护
  5. java前言_Java Web前言
  6. H.264的CAVLC(编码.解码)过程详解
  7. beanutils获取带参数get方法
  8. 大数据之-Hadoop之HDFS_HDFS的优缺点---大数据之hadoop工作笔记0049
  9. impdp oracle 只导入表结构_oracle数据库怎么导入dmp,只导入数据不导入表结构?...
  10. python 3 json 序列化
  11. 总结windows下堆溢出的三种利用方式
  12. mfc之CPtrArray数组
  13. 独立事件、笛卡尔积与矩阵向量乘法
  14. Vue:结合ElementUI元素超过一定高度加滚动框,高度由浏览器高度决定并随浏览器变化而变化
  15. 敏感关键词 词库_关键词优化难度分析怎么做?老鸟如何一键筛选优质关键词(悬赏1元)...
  16. 2手房地产营销企划书
  17. 内存的物理结构和工作原理
  18. SpringBoot线程池获取service实例空指针
  19. TO B销售谈判经验 TO B销售技巧分享
  20. win10 Bat脚本获取管理员权限

热门文章

  1. nRF2401A/nRF24L01/nRF24L01+无线模块最常见问题汇集(转)
  2. 墨尔本大学计算机本科学费,墨尔本大学本科学费要多少
  3. linux centos设置定时重启,Linux CentOS使用crontab设置定时重启的方法
  4. DAMA-总结(数据管理的总结)
  5. linux硬盘对拷ghost,ghost+linux+DOM 硬盘对拷
  6. C语言编译器概要设计思路一
  7. 蚌埠有考计算机等级的考点吗,2021年3月安徽省蚌埠市计算机等级考试考务通知...
  8. devc++密室逃脱小游戏
  9. VaR(value at risk)在险价值
  10. Python分析万条数据,告诉你奔驰宝马奥迪谁更垃圾