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

目录

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

一、简单介绍

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

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

四、注意事项

附录:

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


一、简单介绍

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

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

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

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

路径说明:

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

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

1、Github 下载

Releases · opencv/opencv · GitHub

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

2、Opencv 官网下载

Releases - OpenCV

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

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

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

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

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

具体方法如下:

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

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

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

1、编写代码

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

2、运行效果

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

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

04-17 06:30