两个文件夹,一个为训练数据集,一个为测试数据集,训练数据集中有两个文件夹0和1,之前看一些资料有说这里要遵循“slabel”命名规则,但后面处理起来比较麻烦,因为目前opencv接受的人脸识别标签为整数,那我们就直接用整数命名吧:


为了简便,我们每个人用20张照片来训练,0代表薛之谦,1代表杨洋:


再准备两张图片用于测试

# # -*- coding:utf-8 -*-
import cv2
import os
import numpy as np# 检测人脸
def detect_face(img):#将测试图像转换为灰度图像,因为opencv人脸检测器需要灰度图像gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#加载OpenCV人脸检测分类器Haarface_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')#检测多尺度图像,返回值是一张脸部区域信息的列表(x,y,宽,高)faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5)# 如果未检测到面部,则返回原始图像if (len(faces) == 0):return None, None#目前假设只有一张脸,xy为左上角坐标,wh为矩形的宽高(x, y, w, h) = faces[0]#返回图像的正面部分return gray[y:y + w, x:x + h], faces[0]# 该函数将读取所有的训练图像,从每个图像检测人脸并将返回两个相同大小的列表,分别为脸部信息和标签
def prepare_training_data(data_folder_path):# 获取数据文件夹中的目录(每个主题的一个目录)dirs = os.listdir(data_folder_path)# 两个列表分别保存所有的脸部和标签faces = []labels = []# 浏览每个目录并访问其中的图像for dir_name in dirs:# dir_name(str类型)即标签label = int(dir_name)# 建立包含当前主题主题图像的目录路径subject_dir_path = data_folder_path + "/" + dir_name# 获取给定主题目录内的图像名称subject_images_names = os.listdir(subject_dir_path)# 浏览每张图片并检测脸部,然后将脸部信息添加到脸部列表faces[]for image_name in subject_images_names:# 建立图像路径image_path = subject_dir_path + "/" + image_name# 读取图像image = cv2.imread(image_path)# 显示图像0.1scv2.imshow("Training on image...", image)cv2.waitKey(100)# 检测脸部face, rect = detect_face(image)# 我们忽略未检测到的脸部if face is not None:#将脸添加到脸部列表并添加相应的标签faces.append(face)labels.append(label)cv2.waitKey(1)cv2.destroyAllWindows()#最终返回值为人脸和标签列表return faces, labels#调用prepare_training_data()函数
faces, labels = prepare_training_data("training_data")#创建LBPH识别器并开始训练,当然也可以选择Eigen或者Fisher识别器
face_recognizer = cv2.face.LBPHFaceRecognizer_create()
face_recognizer.train(faces, np.array(labels))#根据给定的(x,y)坐标和宽度高度在图像上绘制矩形
def draw_rectangle(img, rect):(x, y, w, h) = rectcv2.rectangle(img, (x, y), (x + w, y + h), (128, 128, 0), 2)
# 根据给定的(x,y)坐标标识出人名
def draw_text(img, text, x, y):cv2.putText(img, text, (x, y), cv2.FONT_HERSHEY_COMPLEX, 1, (128, 128, 0), 2)#建立标签与人名的映射列表(标签只能为整数)
subjects = ["jiaju", "jiaqiang"]# 此函数识别传递的图像中的人物并在检测到的脸部周围绘制一个矩形及其名称
def predict(test_img):#生成图像的副本,这样就能保留原始图像img = test_img.copy()#检测人脸face, rect = detect_face(img)#预测人脸label = face_recognizer.predict(face)# 获取由人脸识别器返回的相应标签的名称label_text = subjects[label[0]]# 在检测到的脸部周围画一个矩形draw_rectangle(img, rect)# 标出预测的名字draw_text(img, label_text, rect[0], rect[1] - 5)#返回预测的图像return img#加载测试图像
test_img1 = cv2.imread("test_data/test1.jpg")
test_img2 = cv2.imread("test_data/test2.jpg")#执行预测
predicted_img1 = predict(test_img1)
predicted_img2 = predict(test_img2)#显示两个图像
cv2.imshow(subjects[0], predicted_img1)
cv2.imshow(subjects[1], predicted_img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果图:

haarcascades—各种分类器xml文件下载地址:
https://github.com/opencv/opencv/tree/master/data/haarcascades

基于Opencv快速实现人脸识别(图片识别)相关推荐

  1. 基于Opencv快速实现人脸识别(完整版)

    上篇博客:https://blog.csdn.net/beyond9305/article/details/92844258严格来说标题是有误的,只是单纯地对人脸进行了检测,而并非识别,opencv内 ...

  2. 【优秀课设】基于OpenCV的Python人脸识别、检测、框选(遍历目录下所有照片依次识别 视频随时标注)

    基于OpenCV的Python人脸识别.检测.框选 (遍历目录下所有照片依次识别 视频随时标注) 移步: https://blog.csdn.net/weixin_53403301/article/d ...

  3. opencv快速入门人脸检测与人脸识别

    让"它"认得你 --利用opencv快速入门人脸检测与人脸识别 opencv,顾名思义"开源,计算机视觉".OpenCV就是这样的一个特殊的框架,一群大牛然绕自 ...

  4. 基于 OpenCV + Python 的人脸识别上课签到系统

    目录 前言 安装第三方库 第一步:采集人脸图像 (1)修改姓名学号 (2)运行capture_face.py (3)采集人脸图像 (4)查看采集到的人脸图像 第二步:训练模型 第三步:识别签到 (1) ...

  5. 【毕业设计/课程设计】基于opencv的高精度人脸识别考勤系统设计与实现

    文章目录 0 项目说明 1 需求分析 2 总体设计 3 详细设计 4 程序运行结果测试与分析 5 实验心得 6 项目源码 0 项目说明 基于opencv的高精度人脸识别考勤系统设计与实现 提示:适合用 ...

  6. 调用笔记本的摄像头实现基于opencv的视频人脸识别(中文显示和英文显示)以及 index 480 is out of bounds for axis 0 with size 480错误的解决

    @人脸识别代码和一些常见错误 基于opencv的视频人脸识别(中文显示)以及 index 480 is out of bounds for axis 0 with size 480错误的解决 参考了 ...

  7. 基于OpenCV的 SVM算法实现数字识别(四)---代码实现

    三.基于SVM算法实现手写数字识别 作为一个工科生,而非数学专业的学生,我们研究一个算法,是要将它用于实际领域的.下面给出基于OpenCV3.0的SVM算法手写数字识别程序源码(参考http://bl ...

  8. DL之RBM:基于RBM实现手写数字图片识别提高准确率

    DL之RBM:基于RBM实现手写数字图片识别提高准确率 目录 输出结果 设计代码 输出结果 设计代码 import numpy as np import matplotlib.pyplot as pl ...

  9. TF之LiR:基于tensorflow实现手写数字图片识别准确率

    TF之LiR:基于tensorflow实现手写数字图片识别准确率 目录 输出结果 代码设计 输出结果 Extracting MNIST_data\train-images-idx3-ubyte.gz ...

最新文章

  1. C++智能指针:weak_ptr实现详解
  2. oracle @spool,Oracle spool 用法小结
  3. 优化你的CPU来做深度学习
  4. PHP-Zend引擎剖析之词法分析(一)
  5. 事件查看器ID 1041
  6. 5 个 IDEA 必备插件,让效率成为习惯
  7. 从0开始详解 Johnson 全源最短路(P5905 【模板】Johnson 全源最短路)
  8. linux下设置程序后台运行,linux中如何让进程在后台运行
  9. Win7使用之查端口,杀进程
  10. CodeRunner激活
  11. 06-13最新Xcode7 beta版迅雷离线下载
  12. 二进制数的反码和补码
  13. 单片机c51语言实训总结,单片机实训报告
  14. ThinkPHP php 仿千图网源码_仿百度网盘文件分享dzzoffice网盘系统源码_PHP
  15. 电子科技大学820计算机专业基础参考资料,电子科技大学
  16. 幼师计算机课是上什么,幼师面试 鱼在天空飞,鸟在水里游是小班课程,还是中班,大班的课程...
  17. Python实现仿射密码
  18. R语言的导数计算(转)
  19. 处理CSV&JSON文件(chapter_16)
  20. java图片框_java实现图片写入高清字体及带边框的方法

热门文章

  1. 学习PLC编程的2个简单方法
  2. 使用blender做一个地球模型,贴上UV纹理,导出Obj格式
  3. 深度理解互联网思维,不可不读的50本书(记录下,后面读)
  4. PMSM中常用的两种坐标变换——Park变换
  5. 二叉树递归和非递归遍历
  6. html网站模版用什么修改,网站后台模版html如何修改?网站模板能随便更改吗?...
  7. 【小白的CFD之旅】07 CFD常识
  8. heic文件怎么打开?你知道heci格式吗?
  9. flash助手推送关闭
  10. 十六届智能车全向组算法开源(一)