Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之一 简单人脸识别

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之一 简单人脸识别

目录

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之一 简单人脸识别

一、简单介绍

二、简单人脸识别实现原理

三、简单人脸识别案例实现简单步骤

四、注意事项

附录:

一、cv2.data.haarcascades 目录下,一些文件的详细说明


一、简单介绍

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。

这里使用 Python  基于 OpenCV 进行视觉图像处理,......

人脸检测的两个重要概念:哈尔特征分类器(Haar Feature Classifier)和级联分类器(Cascade Classifier)是用于。

哈尔特征分类器

  • 定义:哈尔特征分类器是一种基于哈尔特征的机器学习算法,用于检测图像中的对象或特定区域。

  • 原理:哈尔特征是一种基于图像局部特征的数学描述方法,通过对图像中不同区域像素值的差异进行计算,提取出具有区分度的特征。这些特征可以是边缘、线段、角点等。哈尔特征分类器通过训练过程学习到一组有效的特征模式,用于区分目标和非目标区域。

  • 应用:哈尔特征分类器常用于对象检测任务,如人脸检测、眼睛检测等。在训练过程中,通常需要提供正样本(包含目标的图像)和负样本(不包含目标的图像),让分类器学习区分目标和非目标的特征模式。

级联分类器

  • 定义:级联分类器是一种多级联组成的分类器结构,由多个弱分类器组成,通过级联方式实现目标检测。

  • 原理:级联分类器将多个简单的分类器组合成一个复杂的分类器,每个简单分类器都是一个弱分类器,对目标区域进行初步筛选或过滤。级联分类器通过级联多个弱分类器,每个分类器都负责判断一组特征是否满足条件,通过级联的方式实现高效的目标检测。

  • 应用:级联分类器常用于实时目标检测任务,如人脸检测、车辆检测等。OpenCV 中的 Haar 级联分类器是基于哈尔特征的级联分类器,通过级联多个分类阶段来实现高效的人脸检测。级联分类器的优势在于其高速、高效的检测性能,适用于实时应用场景。

OpenCV 提供了一些已经训练好的级联分类器,这些级联分类器以XML文件的方式保存在以下路径中:

 ...\Python\Lib\site-packages\cv2\data\

路径说明:

  •  “...\Python\”:Python虚拟机的本地目录。
  •  “\Lib\site-packages\”:pip安装扩展包的默认目录。
  •  “\cv2\data\”:OpenCV库的data文件夹。

OpenCV提供了一些经过预训练的人脸检测器模型文件,这些文件通常包含在OpenCV的安装包中。你可以在OpenCV的官方GitHub页面或者OpenCV官方网站的下载页面找到这些模型文件的下载链接。

一般来说,你可以从以下位置获取OpenCV的预训练模型文件:

  1. OpenCV GitHub Release 页面:在 Releases · opencv/opencv · GitHub 找到你需要的版本,然后在下载的压缩包中找到位于 opencv\data 目录下的人脸检测器模型文件。

  2. OpenCV 官方网站下载页面:访问 OpenCV 官方网站 https://opencv.org/releases/ ,下载你需要的版本,并在相应的压缩包中查找人脸检测器模型文件。

请确保下载与你使用的OpenCV版本兼容的模型文件。

1、Github 下载

Releases · opencv/opencv · GitHub

2、Opencv 官网下载

Releases - OpenCV

二、简单人脸识别实现原理

人脸检测是计算机视觉中的一项任务,旨在自动识别图像或视频中的人脸区域。其主要目标是从复杂的图像中准确地定位和识别出人脸,通常通过以下步骤实现:

  1. 特征提取:使用图像处理和特征工程技术,提取图像中可能代表人脸的特征,如边缘、纹理等。

  2. 分类器训练:利用机器学习或深度学习算法,基于提取的特征训练分类器模型。这些模型能够区分人脸和非人脸区域。

  3. 人脸检测:将训练好的分类器应用于图像或视频数据,通过在不同位置、尺度和方向上滑动窗口,并利用分类器识别可能包含人脸的区域,从而完成人脸检测任务。

  4. 人脸定位:对检测到的人脸区域进行定位,通常是用矩形框标注人脸位置。

  5. 后处理:根据实际需求对检测结果进行进一步处理,如去除重叠框、合并相邻框等。

人脸检测在计算机视觉和人工智能领域有着广泛的应用,包括人脸识别、表情分析、人脸跟踪、人脸融合等方面。

人脸检测的实现原理主要基于哈尔特征分类器和级联分类器(Cascade Classifier)的概念。这些分类器基于机器学习算法,通过训练从大量正样本(包含人脸的图像)和负样本(不包含人脸的图像)中学习人脸特征,并能够在新图像中快速准确地检测人脸。

具体方法如下:

  1. 加载分类器模型:首先,需要加载已经训练好的人脸分类器模型。OpenCV提供了训练好的分类器文件,例如haarcascade_frontalface_default.xml,用于人脸检测。

  2. 读取图像:将待检测的图像读取为OpenCV的图像对象。

  3. 转换为灰度图像:由于人脸检测通常不需要颜色信息,因此将图像转换为灰度图像可以加快处理速度。

  4. 人脸检测:利用detectMultiScale函数进行人脸检测。该函数会返回一个矩形列表,每个矩形表示一个检测到的人脸区域的位置和大小。

  5. 绘制人脸框:遍历检测到的人脸区域,利用OpenCV提供的绘制函数在原始图像上绘制矩形框,标注出人脸位置。

  6. 显示结果:将绘制了人脸框的图像显示出来,或者保存到文件中。

人脸检测过程中,涉及了以下几个关键函数:

  • cv2.CascadeClassifier()

    • 功能:加载级联分类器模型。
    • 参数:需要传入训练好的分类器模型的路径。
    • 返回值:返回一个CascadeClassifier对象,用于后续的人脸检测。
  • detectMultiScale()

    • 功能:对图像进行多尺度目标检测。
    • 参数
      • image:待检测的图像。
      • scaleFactor:用于缩放图像大小的比例因子,用于在不同尺度下搜索目标。
      • minNeighbors:指定每个目标至少要被检测到多少次才算是真正的目标。
      • minSize:目标的最小尺寸。
      • flags:检测模式。
      • minSize:目标的最小尺寸。
    • 返回值:返回一个矩形列表,每个矩形表示一个检测到的目标的位置和大小。
  • cv2.rectangle()

    • 功能:在图像上绘制矩形框。
    • 参数
      • image:要绘制矩形框的图像。
      • pt1:矩形左上角的坐标。
      • pt2:矩形右下角的坐标。
      • color:矩形框的颜色。
      • thickness:矩形框的线条粗细。
    • 返回值:无。
  • cv2.putText()

    • 功能:在图像上绘制文本。
    • 参数
      • image:要绘制文本的图像。
      • text:要绘制的文本内容。
      • org:文本左下角的坐标。
      • fontFace:字体类型。
      • fontScale:字体大小的缩放因子。
      • color:文本颜色。
      • thickness:文本线条粗细。
      • lineType:文本线条类型。
    • 返回值:无。

这些函数是实现人脸检测和在图像上标注人脸框的关键函数,通过它们可以完成人脸检测任务并将结果可视化。

三、简单人脸识别案例实现简单步骤

1、编写代码

2、运行效果

3、具体代码

"""
简单人脸识别
    1、加载分类器模型:首先,需要加载已经训练好的人脸分类器模型。OpenCV提供了训练好的分类器文件,例如haarcascade_frontalface_default.xml,用于人脸检测。
    2、读取图像:将待检测的图像读取为OpenCV的图像对象。
    3、转换为灰度图像:由于人脸检测通常不需要颜色信息,因此将图像转换为灰度图像可以加快处理速度。
    4、人脸检测:利用detectMultiScale函数进行人脸检测。该函数会返回一个矩形列表,每个矩形表示一个检测到的人脸区域的位置和大小。
    5、绘制人脸框:遍历检测到的人脸区域,利用OpenCV提供的绘制函数在原始图像上绘制矩形框,标注出人脸位置。
    6、显示结果:将绘制了人脸框的图像显示出来,或者保存到文件中。
"""


import os
import cv2


def detect_faces(image_path, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30)):
    """
    识别图像中的人脸,并绘制人脸轮廓
    :param image_path:(str)输入图像的文件路径
    :param scaleFactor:(float)用于图像尺度补偿的比例因子
    :param minNeighbors:(int)每个候选矩形应该保留的邻近数量
    :param minSize:(tuple)人脸的最小尺寸。
    :return: numpy.ndarray 绘制了人脸轮廓的图像数据;int 检测到的人脸数量
    """
    # 检查图像文件路径是否存在
    if not os.path.isfile(image_path):
        raise FileNotFoundError("Input image file not found.")

    # 加载人脸分类器
    face_cascade = cv2.CascadeClassifier(
        r'YourPath\opencv-4.8.0\data\haarcascades\haarcascade_frontalface_default.xml')

    # 读取图像
    image = cv2.imread(image_path)

    # 将图像转换为灰度图像
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    # 检测人脸
    faces = face_cascade.detectMultiScale(gray_image, scaleFactor=scaleFactor, minNeighbors=minNeighbors,
                                          minSize=minSize)

    # 人脸标签计数
    num = 0

    # 绘制人脸轮廓
    for (x, y, w, h) in faces:
        num += 1
        cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2)
        cv2.putText(image, f'Face {num}', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)

    # 返回带有绘制的人脸轮廓的图像和检测到的人脸数量
    return image, len(faces)


def main():
    # 调用函数并指定输入图像文件路径
    input_image_path = 'Images/FourPeopleFace.jpg'
    detected_image, num_faces = detect_faces(input_image_path)

    # 显示检测到的人脸数量
    print("Number of faces detected:", num_faces)

    # 显示绘制了人脸轮廓的图像
    cv2.imshow('Detected Faces', detected_image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


if __name__ == "__main__":
    main()

四、注意事项

  1. 分类器选择:选择合适的分类器对于人脸检测的准确性至关重要。OpenCV提供了多个预训练好的分类器,可以根据需要选择合适的分类器。

  2. 参数调优detectMultiScale函数接受一些参数,例如scaleFactorminNeighborsminSize等,这些参数会影响检测结果的准确性和速度。需要根据实际情况进行调优。

  3. 图像预处理:有时候在进行人脸检测之前可能需要对图像进行一些预处理,例如去噪、直方图均衡化等,以提高检测的准确性。

  4. 性能优化:人脸检测是一个计算密集型任务,特别是在大型图像上或者实时视频流中。可以通过降低图像分辨率、使用多线程等方法来提高性能。

  5. 结果处理:在使用检测结果时,需要注意处理可能出现的错误和异常情况,例如检测不到人脸时的处理方式。

综上所述,人脸检测的实现方法基于分类器模型和图像处理技术,通过识别人脸的特征并在图像中标注出人脸位置来实现。在实现过程中需要注意选择合适的分类器、调优参数、进行必要的图像预处理以及处理检测结果。

附录:

一、cv2.data.haarcascades 目录下,一些文件的详细说明

  1. haarcascade_eye.xml

    • 功能:用于检测眼睛的分类器。
    • 文件名:haarcascade_eye.xml
    • 用途:检测图像或视频中的眼睛区域。
  2. haarcascade_eye_tree_eyeglasses.xml

    • 功能:用于检测佩戴眼镜的眼睛的分类器。
    • 文件名:haarcascade_eye_tree_eyeglasses.xml
    • 用途:类似于 haarcascade_eye.xml,但更适用于佩戴眼镜的人群。
  3. haarcascade_frontalface_alt.xml

    • 功能:用于检测正面人脸的分类器。
    • 文件名:haarcascade_frontalface_alt.xml
    • 用途:检测图像或视频中的正面人脸区域。
  4. haarcascade_frontalface_alt2.xml

    • 功能:用于检测正面人脸的分类器,改进版本。
    • 文件名:haarcascade_frontalface_alt2.xml
    • 用途:与 haarcascade_frontalface_alt.xml 类似,但改进了性能和准确性。
  5. haarcascade_frontalface_alt_tree.xml

    • 功能:用于检测正面人脸的分类器,基于 Haar 特征的树形结构。
    • 文件名:haarcascade_frontalface_alt_tree.xml
    • 用途:与 haarcascade_frontalface_alt.xml 类似,但使用了不同的检测算法。
  6. haarcascade_frontalface_default.xml

    • 功能:用于检测正面人脸的分类器,默认版本。
    • 文件名:haarcascade_frontalface_default.xml
    • 用途:与 haarcascade_frontalface_alt.xml 类似,是默认的人脸检测模型。
  7. haarcascade_profileface.xml

    • 功能:用于检测侧面人脸的分类器。
    • 文件名:haarcascade_profileface.xml
    • 用途:检测图像或视频中的侧面人脸区域。

这些 XML 文件包含了在大量正样本(带有目标)和负样本(不带目标)上进行训练后得到的分类器模型。加载这些模型后,可以用于检测图像或视频中的目标区域。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/558979.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ContextMenuStrip内容菜单源对象赋值学习笔记(含源码)

一、前言 MetroTileItem属于第三方控件,无法定义ContextMenuStrip属性 想实现某子项点击菜单时,与源控件(按钮metroTileItem)的某值对应,用于动态控制按钮的状态或方法 1.1 效果 二、实现方法 2.1 方法1 (代码,说明见注释) private void metroTileItem_MouseDown(o…

基于Springboot的小区物业管理系统

基于SpringbootVue的小区物业管理系统的设计与实现 开发语言:Java数据库:MySQL技术:SpringbootMybatis工具:IDEA、Maven、Navicat 系统展示 用户登录 首页 用户管理 员工管理 业主信息管理 费用信息管理 楼房信息管理 保修信息…

攻防世界---reverse_re3

1.下载附件,先查壳:无壳 2.在IDA中分析,shiftfnf5,看到一串长得很像flag的flag 3.根据提示我们需要找到输入,再进行md5转换才能得到flag flag{md5(your input)} 4.双击这个句话,点进去想查看信息&#xff0…

MongoDB学习【一】MongoDB简介和部署

MongoDB简介 MongoDB是一种开源的、面向文档的、分布式的NoSQL数据库系统,由C语言编写而成。它的设计目标是为了适应现代Web应用和大数据处理场景的需求,提供高可用性、横向扩展能力和灵活的数据模型。 主要特点: 文档模型: Mon…

西宁市初中生地会考报名照片尺寸要求及手机自拍方法

西宁市初中生地会考即将到来,对于参加考试的同学们来说,准备一张符合规格的报名照片是整个报名流程中不可或缺的一环。一张规范的证件照不仅展示了学生的精神面貌,同时也是顺利报名的重要条件之一。本文将详细介绍西宁市初中生地会考报名所需…

SSDReporter for Mac:全面检测SSD健康,预防数据丢失,让您的Mac运行更稳定

SSDReporter for Mac是一款专为Mac用户设计的固态硬盘(SSD)健康状况检测工具,旨在帮助用户全面了解并监控其Mac设备中SSD的工作状态,从而确保数据的完整性和设备的稳定性。 这款软件具有多种强大的功能。首先,它能够定…

【分治】Leetcode 库存管理 III

题目讲解 LCR 159. 库存管理 III 本题的含义就是让求出最小的k个数 算法讲解 class Solution { public:void my_qsort(vector<int>& nums, int l, int r){if(l > r) return ;int i l, left l-1, right r1;int key nums[rand() % (r - l 1) l];//完成分三…

深度学习基础之《TensorFlow框架(12)—图片数据》

一、图像基本知识 1、如何转换图片文件 回忆&#xff1a;之前我们在特征抽取中讲过如何将文本处理成数据 思考&#xff1a;如何将图片文件转换成机器学习算法能够处理的数据&#xff1f; 我们经常接触到的图片有两种&#xff0c;一种是黑白图片&#xff08;灰度图&#xff09;…

C++ - STL详解—vector类

一. vector的概念 向量&#xff08;Vector&#xff09;是一个封装了动态大小数组的顺序容器&#xff08;Sequence Container&#xff09;。跟任意其它类型容器一样&#xff0c;它能够存放各种类型的对象。可以简单的认为&#xff0c;向量是一个能够存放任意类型的动态数组。 …

阿里云ECS服务器安装docker

首先查看阿里云ECS的服务器的版本 cat /etc/redhat-release如果是Alibaba Cloud Linux release 3,请执行以下命令 添加docker-ce的dnf源。 sudo dnf config-manager --add-repohttps://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装Alibaba Cloud Linux 3专…

深度学习每周学习总结P5(运动鞋识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 –来自百度网盘超级会员V5的分享 目录 0. 总结1. 数据导入及处理部分2. 加载数据集3.模型构建部分3.1 模型构建3.2 公式推导 4. 设置超参…

小型燃气站3D可视化:打造安全高效的燃气新时代

随着科技的不断进步&#xff0c;越来越多的行业开始融入3D可视化技术&#xff0c;燃气行业也不例外。 小型燃气站作为城市燃气供应的重要节点&#xff0c;其安全性和运行效率至关重要。传统的燃气站管理方式往往依赖于人工巡检和纸质记录&#xff0c;这种方式不仅效率低下&…

开源大数据集群部署(二十一)Spark on yarn 部署

作者&#xff1a;櫰木 1 spark on yarn安装&#xff08;每个节点&#xff09; cd /root/bigdata/ tar -xzvf spark-3.3.1-bin-hadoop3.tgz -C /opt/ ln -s /opt/spark-3.3.1-bin-hadoop3 /opt/spark chown -R spark:spark /opt/spark-3.3.1-bin-hadoop32 配置环境变量及修改配…

BFS解决八数码问题-java

本文主要通过BFS广度优先搜索来解决八数码问题。 文章目录 前言 一、八数码 二、算法思路 1.思路模拟 2.实现思路 三、代码 1.代码如下&#xff1a; 2.读入数据 3.代码运行结果 总结 前言 本文主要通过BFS广度优先搜索来解决八数码问题。 提示&#xff1a;以下是本篇文章正文内…

有没有手机上使用的库存软件

库存软件是一种仓库的信息管理系统&#xff0c;它主要针对出库与入库这些数据进行管理&#xff0c;传统的库存管理都是在电脑上安装一个专门的数据库管理系统进行管理&#xff0c;这也是一种比较成熟的管理方式&#xff0c;那么有没有手机上使用的库存软件。 手机上使用的库存软…

开发工具——postman使用教程详解

一、概念 1、Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件&#xff0c;Postman分为Postman native app和Postman Chrome app两个版本。目前Chrome app已停止维护&#xff0c;官方不推荐使用该版本。 2、官网下载地址&#xff1a;http://www.getpostman.com…

离线数仓数据导出-hive数据同步到mysql

离线数仓数据导出-hive数据同步到mysql MySQL建库建表数据导出 为方便报表应用使用数据&#xff0c;需将ads各指标的统计结果导出到MySQL数据库中。 datax支持hive同步MySQL&#xff1a;仅仅支持hive存储的hdfs文件导出。所以reader选hdfs-reader&#xff0c;writer选mysql-wri…

架构师系列-搜索引擎ElasticSearch(十)- 索引别名及重建

索引别名 别名&#xff0c;有点类似数据库的视图&#xff0c;别名一般都会和一些过滤条件相结合&#xff0c;可以做到即使是同一个索引上&#xff0c;让不同人看到不同的数据。 别名的作用 在开发中&#xff0c;一般随着业务需求的迭代&#xff0c;较老的业务逻辑就要面临更新…

架构设计-权限系统之通用的权限系统设计方案

一个系统&#xff0c;如果没有安全控制&#xff0c;是十分危险的&#xff0c;一般安全控制包括身份认证和权限管理。用户访问时&#xff0c;首先需要查看此用户是否是合法用户&#xff0c;然后检查此用户可以对那些资源进行何种操作&#xff0c;最终做到安全访问。身份认证的方…

Junit 基础-ApiHug准备-测试篇-009

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace 注解 J…
最新文章