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

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

ztj100 2024-10-30 05:12 47 浏览 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()

相关推荐

作为后端开发,你知道MyBatis有哪些隐藏的 “宝藏” 扩展点吗?

在互联网大厂后端开发领域,MyBatis作为一款主流的持久层框架,凭借其灵活的配置与强大的数据处理能力,广泛应用于各类项目之中。然而,随着业务场景日趋复杂、系统规模不断扩张,开发过程中常面临SQL...

基于Spring+SpringMVC+Mybatis分布式敏捷开发系统架构(附源码)

前言zheng项目不仅仅是一个开发架构,而是努力打造一套从前端模板-基础框架-分布式架构-开源项目-持续集成-自动化部署-系统监测-无缝升级的全方位J2EE企业级开发解...

基于Java实现,支持在线发布API接口读取数据库,有哪些工具?

基于java实现,不需要编辑就能发布api接口的,有哪些工具、平台?还能一键发布、快速授权和开放提供给第三方请求调用接口的解决方案。架构方案设计:以下是一些基于Java实现的无需编辑或只需少量编辑...

Mybatis Plus框架学习指南-第三节内容

自动填充字段基本概念MyBatis-Plus提供了一个便捷的自动填充功能,用于在插入或更新数据时自动填充某些字段,如创建时间、更新时间等。原理...

被你误删了的代码,在 IntelliJ IDEA中怎么被恢复

在IntelliJIDEA中一不小心将你本地代码给覆盖了,这个时候,你ctrl+z无效的时候,是不是有点小激动?我今天在用插件mybatisgenerator自动生成mapper的时候,...

修改 mybatis-generator 中数据库类型和 Java 类型的映射关系

使用mybatis-generator发现数据库类型是tinyint(4),生成model时字段类型是Byte,使用的时候有点不便数据库的类型和Model中Java类型的关系...

又被问到了, java 面试题:反射的实现原理及用途?

一、反射的实现原理反射(Reflection)是Java在运行时动态获取类的元数据(如方法、字段、构造器等)并操作类对象的能力。其核心依赖于...

Spring Boot 中JPA和MyBatis技术那个更好?

你在进行SpringBoot项目开发时,是不是也经常在选择JPA和MyBatis这两个持久化技术上犯难?面对众多前辈的经验之谈,却始终拿不准哪种技术才最适合自己的项目?别担心,今天咱们就...

Spring Boot (七)MyBatis代码自动生成和辅助插件

一、简介1.1MyBatisGenerator介绍MyBatisGenerator是MyBatis官方出品的一款,用来自动生成MyBatis的mapper、dao、entity的框架,让...

解决MyBatis Generator自动生成.java.1文件

MyBatis框架操作数据库,一张表对应着一个实体类、一个Mapper接口文件、一个Mapper映射文件。一个工程项目通常最少也要几十张表,那工作量可想而知非常巨大的,MyBatis框架替我们想好了解...

Linux yq 命令使用详解

简介yq是一个轻量级、可移植的命令行...

7 段不到 50 行的 Python 脚本,解决 7 个真实麻烦:代码、场景与可复制

“...

Python学不会来打我(62) json数据操作汇总

很多小伙伴学了很久的python一直还是没有把数据类型之间的转换搞明白,上一篇文章我们详细分享了python的列表、元组、字典、集合之间的相互转换,这一篇文章我们来分享json数据相关的操作,虽然严格...

之前3W买的Python全系列教程完整版(懂中文就能学会)

今天给大家带来了干货,Python入门教程完整版,完整版啊!完整版!言归正传,小编该给大家介绍一下这套教程了,希望每个小伙伴都沉迷学习,无法自拔...

x-cmd pkg | grex - 正则表达式生成利器,解决手动编写的烦恼

简介grex是一个旨在简化创作正则表达式的复杂且繁琐任务的库和命令行程序。这个项目最初是DevonGovett编写的JavaScript工具regexgen的Rust移植。但re...

取消回复欢迎 发表评论: