百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

如何使用OpenCV 库 Haar 级联分类器进行人脸检测

ztj100 2024-10-30 05:12 19 浏览 0 评论

OpenCV 中的 Haar 级联分类器是一种基于 Haar 特征的目标检测方法,常用于人脸检测、眼睛检测等任务。

  • Haar 特征:Haar 特征是一种简单的矩形特征,用于描述图像中的局部区域。这些特征通过计算矩形区域内的像素值之和的差异来表示图像的特定模式。例如,一个常见的 Haar 特征是计算一个矩形区域内的像素值之和与另一个矩形区域内的像素值之和的差异,用于检测图像中的边缘或线条。
  • 级联分类器:级联分类器是由多个弱分类器组成的强分类器。在 Haar 级联分类器中,每个弱分类器是一个基于 Haar 特征的简单决策树。这些弱分类器按照一定的顺序组合在一起,形成一个级联结构。在检测过程中,图像首先通过第一个弱分类器进行检测。如果图像被判定为不包含目标,则直接拒绝,不再进行后续的检测。如果图像通过了第一个弱分类器,则继续通过下一个弱分类器进行检测。这个过程一直持续到最后一个弱分类器,如果图像通过了所有的弱分类器,则被判定为包含目标。

以下是使用分类器进行人像识别的一般步骤:

一、准备工作

  1. 安装所需库:确保已经安装了 OpenCV 库,它提供了很多用于计算机视觉任务的工具和函数,包括使用分类器进行人像识别。可以使用 pip install opencv-python 进行安装。
  2. 选择合适的分类器:OpenCV 提供了一些预训练的 Haar 级联分类器,用于人脸检测。常见的有 haarcascade_frontalface_default.xml 等,可以根据具体需求选择合适的分类器文件。

二、加载分类器

import cv2
# 加载人脸分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

这里使用 cv2.CascadeClassifier 类加载了人脸检测分类器,用户可以根据不同的需求加载不同的分类器,在安装opencv-python模块后,这些分类器文件就有了,需要把位置添加一下

OpenCV 中预训练的 Haar 级联分类器文件,用于不同对象的检测,具体用途如下:

  • haarcascade_eye.xml:用于检测眼睛。
  • haarcascade_eye_tree_eyeglasses.xml:可能用于检测戴眼镜的眼睛,树状结构的分类器可能在准确性和效率上有一定优势。
  • haarcascade_frontalcatface.xml和haarcascade_frontalcatface_extended.xml:用于检测猫的正面脸部。
  • haarcascade_frontalface_alt.xml、haarcascade_frontalface_alt2.xml、haarcascade_frontalface_alt_tree.xml、haarcascade_frontalface_default.xml:用于检测人的正面脸部,不同的版本可能在检测准确率、速度和对不同场景的适应性上有所不同。
  • haarcascade_fullbody.xml:用于检测全身。
  • haarcascade_lefteye_2splits.xml和haarcascade_righteye_2splits.xml:分别用于检测左眼和右眼,可能采用了特定的分割方法提高检测效果。
  • haarcascade_license_plate_rus_16stages.xml和haarcascade_russian_plate_number.xml:用于检测俄罗斯车牌号码。
  • haarcascade_lowerbody.xml:用于检测下半身。
  • haarcascade_profileface.xml:用于检测侧面脸部。
  • haarcascade_smile.xml:用于检测微笑。
  • haarcascade_upperbody.xml:用于检测上半身。

三、读取图像或视频流

   # 读取图像。这里假设要识别的人像在名为 image.jpg 的图像文件中。
   img = cv2.imread('image.jpg')

#读取视频流:
   # 打开摄像头,这里使用 cv2.VideoCapture 类打开摄像头(参数 0 表示默认摄像头),并在循环中逐帧读取视频流。
   cap = cv2.VideoCapture(0)
   while True:
       ret, frame = cap.read()
       # 如果无法读取帧,退出循环
       if not ret:
           break

四、进行人像检测

1.对于图像:

   # 将图像转换为灰度图(大多数分类器在灰度图像上效果更好)
   gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
   # 检测人脸
   faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

首先将图像转换为灰度图,然后使用分类器的 detectMultiScale 方法在灰度图像上检测人脸。该方法的参数包括缩放因子 scaleFactor、最小邻居数 minNeighbors 和最小检测窗口大小 minSize 等,可以根据实际情况进行调整以获得更好的检测效果。

  1. 对于视频流:
   gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
   faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

对每一帧视频图像进行同样的灰度转换和人脸检测操作。

五、标记和显示人像

  1. 对于图像:
   # 在图像上绘制人脸矩形框
   for (x, y, w, h) in faces:
       cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)

   # 显示结果图像
   cv2.imshow('Image', img)
   cv2.waitKey(0)
   cv2.destroyAllWindows()

遍历检测到的人脸区域,在图像上绘制矩形框,并显示结果图像。

  1. 对于视频流:
   # 在帧上绘制人脸矩形框
   for (x, y, w, h) in faces:
       cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

   # 显示帧
   cv2.imshow('Video', frame)

   # 按下 'q' 键退出循环
   if cv2.waitKey(1) & 0xFF == ord('q'):
       break

   # 释放摄像头并关闭窗口
   cap.release()
   cv2.destroyAllWindows()

在每一帧上绘制人脸矩形框,并显示视频。当用户按下 'q' 键时,退出循环,释放摄像头资源并关闭窗口。

六、完整代码

import cv2

# 一、加载人脸分类器
# 使用 cv2.CascadeClassifier 类加载预训练的人脸检测分类器文件
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# 二、处理图像
def detect_faces_in_image(image_path):
    # 1. 读取图像
    img = cv2.imread(image_path)
    # 2. 将图像转换为灰度图,因为大多数分类器在灰度图像上效果更好
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 3. 使用分类器检测人脸
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
    # 4. 在图像上绘制人脸矩形框
    for (x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
    # 5. 显示结果图像
    cv2.imshow('Image with Faces Detected', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 三、处理视频流
def detect_faces_in_video():
    # 1. 打开摄像头,参数 0 表示默认摄像头
    cap = cv2.VideoCapture(0)
    while True:
        # 2. 逐帧读取视频流
        ret, frame = cap.read()
        if not ret:
            break
        # 3. 将帧转换为灰度图
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 4. 使用分类器检测人脸
        faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
        # 5. 在帧上绘制人脸矩形框
        for (x, y, w, h) in faces:
            cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
        # 6. 显示帧
        cv2.imshow('Video with Faces Detected', frame)
        # 7. 按下 'q' 键退出循环
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    # 8. 释放摄像头资源并关闭窗口
    cap.release()
    cv2.destroyAllWindows()

# 四、测试
# 处理图像
image_path = 'test_image.jpg'
detect_faces_in_image(image_path)
# 处理视频流
detect_faces_in_video()

相关推荐

Whoosh,纯python编写轻量级搜索工具

引言在许多应用程序中,搜索功能是至关重要的。Whoosh是一个纯Python编写的轻量级搜索引擎库,可以帮助我们快速构建搜索功能。无论是在网站、博客还是本地应用程序中,Whoosh都能提供高效的全文搜...

如何用Python实现二分搜索算法(python二分法查找代码)

如何用Python实现二分搜索算法二分搜索(BinarySearch)是一种高效的查找算法,适用于在有序数组中快速定位目标值。其核心思想是通过不断缩小搜索范围,每次将问题规模减半,时间复杂度为(O...

路径扫描 -- dirsearch(路径查找器怎么使用)

外表干净是尊重别人,内心干净是尊重自己,干净,在今天这个时代,应该是一种极高的赞美和珍贵。。。----网易云热评一、软件介绍Dirsearch是一种命令行工具,可以强制获取web服务器中的目录和文件...

78行Python代码帮你复现微信撤回消息!

来源:悟空智能科技本文约700字,建议阅读5分钟。本文基于python的微信开源库itchat,教你如何收集私聊撤回的信息。...

从零开始学习 Python!2《进阶知识》 Python进阶之路

欢迎来到Python学习的进阶篇章!如果你说已经掌握了基础语法,那么这篇就是你开启高手之路的大门。我们将一起探讨面向对象编程...

白帽黑客如何通过dirsearch脚本工具扫描和收集网站敏感文件

一、背景介绍...

Python之txt数据预定替换word预定义定位标记生成word报告(四)

续接Python之txt数据预定替换word预定义定位标记生成word报告(一)https://mp.toutiao.com/profile_v4/graphic/preview?pgc_id=748...

假期苦短,我用Python!这有个自动回复拜年信息的小程序

...

Python——字符串和正则表达式中的反斜杠('\')问题详解

在本篇文章里小编给大家整理的是关于Python字符串和正则表达式中的反斜杠('\')问题以及相关知识点,有需要的朋友们可以学习下。在Python普通字符串中在Python中,我们用'\'来转义某些普通...

Python re模块:正则表达式综合指南

Python...

Python中re模块详解(rem python)

在《...

python之re模块(python re模块sub)

re模块一.re模块的介绍1.什么是正则表达式"定义:正则表达式是一种对字符和特殊字符操作的一种逻辑公式,从特定的字符中,用正则表达字符来过滤的逻辑。(也是一种文本模式;)2、正则表达式可以帮助我们...

MySQL、PostgreSQL、SQL Server 数据库导入导出实操全解

在数字化时代,数据是关键资产,数据库的导入导出操作则是连接数据与应用场景的桥梁。以下是常见数据库导入导出的实用方法及代码,包含更多细节和特殊情况处理,助你应对各种实际场景。一、MySQL数据库...

Zabbix监控系统系列之六:监控 mysql

zabbix监控mysql1、监控规划在创建监控项之前要尽量考虑清楚要监控什么,怎么监控,监控数据如何存储,监控数据如何展现,如何处理报警等。要进行监控的系统规划需要对Zabbix很了解,这里只是...

mysql系列之一文详解Navicat工具的使用(二)

本章内容是系列内容的第二部分,主要介绍Navicat工具的使用。若查看第一部分请见:...

取消回复欢迎 发表评论: