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

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

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

相关推荐

Vue 技术栈(全家桶)(vue technology)

Vue技术栈(全家桶)尚硅谷前端研究院第1章:Vue核心Vue简介官网英文官网:https://vuejs.org/中文官网:https://cn.vuejs.org/...

vue 基础- nextTick 的使用场景(vue的nexttick这个方法有什么用)

前言《vue基础》系列是再次回炉vue记的笔记,除了官网那部分知识点外,还会加入自己的一些理解。(里面会有部分和官网相同的文案,有经验的同学择感兴趣的阅读)在开发时,是不是遇到过这样的场景,响应...

vue3 组件初始化流程(vue组件初始化顺序)

学习完成响应式系统后,咋们来看看vue3组件的初始化流程既然是看vue组件的初始化流程,咋们先来创建基本的代码,跑跑流程(在app.vue中写入以下内容,来跑流程)...

vue3优雅的设置element-plus的table自动滚动到底部

场景我是需要在table最后添加一行数据,然后把滚动条滚动到最后。查网上的解决方案都是读取html结构,暴力的去获取,虽能解决问题,但是不喜欢这种打补丁的解决方案,我想着官方应该有相关的定义,于是就去...

Vue3为什么推荐使用ref而不是reactive

为什么推荐使用ref而不是reactivereactive本身具有很大局限性导致使用过程需要额外注意,如果忽视这些问题将对开发造成不小的麻烦;ref更像是vue2时代optionapi的data的替...

9、echarts 在 vue 中怎么引用?(必会)

首先我们初始化一个vue项目,执行vueinitwebpackechart,接着我们进入初始化的项目下。安装echarts,npminstallecharts-S//或...

无所不能,将 Vue 渲染到嵌入式液晶屏

该文章转载自公众号@前端时刻,https://mp.weixin.qq.com/s/WDHW36zhfNFVFVv4jO2vrA前言...

vue-element-admin 增删改查(五)(vue-element-admin怎么用)

此篇幅比较长,涉及到的小知识点也比较多,一定要耐心看完,记住学东西没有耐心可不行!!!一、添加和修改注:添加和编辑用到了同一个组件,也就是此篇文章你能学会如何封装组件及引用组件;第二能学会async和...

最全的 Vue 面试题+详解答案(vue面试题知识点大全)

前言本文整理了...

基于 vue3.0 桌面端朋友圈/登录验证+60s倒计时

今天给大家分享的是Vue3聊天实例中的朋友圈的实现及登录验证和倒计时操作。先上效果图这个是最新开发的vue3.x网页端聊天项目中的朋友圈模块。用到了ElementPlus...

不来看看这些 VUE 的生命周期钩子函数?| 原力计划

作者|huangfuyk责编|王晓曼出品|CSDN博客VUE的生命周期钩子函数:就是指在一个组件从创建到销毁的过程自动执行的函数,包含组件的变化。可以分为:创建、挂载、更新、销毁四个模块...

Vue3.5正式上线,父传子props用法更丝滑简洁

前言Vue3.5在2024-09-03正式上线,目前在Vue官网显最新版本已经是Vue3.5,其中主要包含了几个小改动,我留意到日常最常用的改动就是props了,肯定是用Vue3的人必用的,所以针对性...

Vue 3 生命周期完整指南(vue生命周期及使用)

Vue2和Vue3中的生命周期钩子的工作方式非常相似,我们仍然可以访问相同的钩子,也希望将它们能用于相同的场景。...

救命!这 10 个 Vue3 技巧藏太深了!性能翻倍 + 摸鱼神器全揭秘

前端打工人集合!是不是经常遇到这些崩溃瞬间:Vue3项目越写越卡,组件通信像走迷宫,复杂逻辑写得脑壳疼?别慌!作为在一线摸爬滚打多年的老前端,今天直接甩出10个超实用的Vue3实战技巧,手把...

怎么在 vue 中使用 form 清除校验状态?

在Vue中使用表单验证时,经常需要清除表单的校验状态。下面我将介绍一些方法来清除表单的校验状态。1.使用this.$refs...

取消回复欢迎 发表评论: