opencv学习:CascadeClassifier和detectMultiScale算法进行人脸识别

CascadeClassifier

CascadeClassifier 是 OpenCV 提供的一个用于对象检测的类,它基于Haar特征和AdaBoost算法。它能够识别图像中的特定对象,比如人脸、眼睛、微笑等。CascadeClassifier 需要一个预训练的XML分类器文件,该文件包含了用于检测对象的特征。

CascadeClassifier 的工作流程

  1. 特征选择:从大量的 Haar 特征中选择最有区分力的特征。这些特征能够最好地区分对象和背景。
  2. 训练 AdaBoost 分类器:使用选定的 Haar 特征训练 AdaBoost 分类器。这个过程会生成一系列弱分类器,每个弱分类器都基于一个 Haar 特征。
  3. 构建级联分类器:将训练好的 AdaBoost 分类器组织成一个级联结构。级联分类器由多个阶段组成,每个阶段包含多个弱分类器。图像首先通过第一阶段的所有弱分类器,如果通过,则进入第二阶段,以此类推。
  4. 检测对象:在新的图像中检测对象时,图像会依次通过级联分类器的每个阶段。如果图像在某个阶段被拒绝,则检测过程结束。如果图像通过了所有阶段,则认为图像中存在目标对象。

detectMultiScale

detectMultiScaleCascadeClassifier 类的一个方法,用于在给定的图像中检测对象。这个方法会返回一个对象列表,每个对象由其在图像中的矩形框坐标表示。这个方法能够处理不同大小的对象,因为它可以在多个尺度上进行检测

1. 滑动窗口(Sliding Window)机制

detectMultiScale 方法使用滑动窗口机制来扫描整个图像。窗口在图像上从左到右、从上到下移动,每次移动一定的步长(不是像素步长,而是窗口步长)。在每个窗口位置,分类器都会被用来评估该区域是否包含目标对象。

2. 多尺度检测

为了检测不同大小的对象,detectMultiScale 方法会对图像进行多次扫描,每次扫描使用不同的窗口尺寸。这是通过调整图像的尺度来实现的,即图像被多次缩放,每次缩放后都进行滑动窗口检测。scaleFactor 参数控制每次缩放时图像尺寸的减小比例。

3. Haar 特征和分类器评估

在每个窗口位置,分类器会评估该窗口内是否包含目标对象。分类器是基于 Haar 特征的,这些特征是从图像的小块区域计算出来的。分类器使用这些特征来评估窗口内的目标对象。

4. 级联分类器

detectMultiScale 方法使用的分类器是一个级联分类器,它由多个阶段组成。每个阶段包含多个基于 Haar 特征的弱分类器。级联分类器的工作方式如下:

  • 第一阶段:快速排除大部分背景区域。如果一个窗口通过了第一阶段的所有弱分类器,它被认为是一个候选区域,进入第二阶段。
  • 后续阶段:更详细地评估候选区域。每个阶段都试图更准确地评估窗口是否包含目标对象。
  • 最终阶段:如果一个窗口通过了所有阶段的分类器,它被认为是一个真正的目标对象。

5. 非极大值抑制(Non-Maximum Suppression)

在检测过程中,可能会在同一个对象上得到多个重叠的候选区域。为了解决这个问题,detectMultiScale 方法使用非极大值抑制。这个步骤会保留最佳的候选区域,并去除那些与最佳区域重叠且置信度较低的区域。

6. 输出结果

detectMultiScale 方法的输出是一个候选区域列表,每个候选区域由其在图像中的矩形框坐标(x, y, width, height)表示。这些坐标定义了检测到的对象的位置和大小。

代码流程

读取图像

import cv2
img=cv2.imread('renlian1.jpg')

图像尺寸调整

def resize(image,width=None,height=None ,inter=cv2.INTER_AREA):
    dim=None
    (h,w) = image.shape[:2]#获取输入图像的高度和宽度。
    if width is None and height is None:#如果宽度和高度都没有指定,则直接返回原始图像。
        return image
    if width is None:#如果只指定了高度,计算新的宽度以保持图像的宽高比。
        r=height/float(h)
        dim=(int(w*r),height)
    else:#如果只指定了宽度,计算新的高度以保持图像的宽高比。
        r=width/float(w)
        dim=(width,int(h*r))
    #根据计算出的尺寸 dim 调整图像大小。
    resized=cv2.resize(image,dim,interpolation=inter)     # 默认为cV2.INTER_AREA,即面积插值,适用于缩放图像。
    return resized
img=resize(img,1000)

转换图像为灰度图

gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

 加载Haar特征分类器

加载OpenCV提供的Haar特征分类器XML文件,该文件用于检测图像中的脸部。

faceCase=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

 检测图像中的脸部

使用加载的分类器和灰度图像,调用detectMultiScale函数来检测图像中的脸部。

faces=faceCase.detectMultiScale(gray,scaleFactor=1.05,minNeighbors=9,minSize=(8,8))

绘制矩形框

遍历检测到的脸部,使用cv2.rectangle函数在每个脸部周围绘制绿色的矩形框。

for (x,y,w,h) in faces:
    cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
cv2.imshow('result',img)
cv2.waitKey(0)

运行结果

完整代码

import cv2
img=cv2.imread('renlian1.jpg')
def resize(image,width=None,height=None ,inter=cv2.INTER_AREA):
    dim=None
    (h,w) = image.shape[:2]#获取输入图像的高度和宽度。
    if width is None and height is None:#如果宽度和高度都没有指定,则直接返回原始图像。
        return image
    if width is None:#如果只指定了高度,计算新的宽度以保持图像的宽高比。
        r=height/float(h)
        dim=(int(w*r),height)
    else:#如果只指定了宽度,计算新的高度以保持图像的宽高比。
        r=width/float(w)
        dim=(width,int(h*r))
    #根据计算出的尺寸 dim 调整图像大小。
    resized=cv2.resize(image,dim,interpolation=inter)     # 默认为cV2.INTER_AREA,即面积插值,适用于缩放图像。
    return resized
img=resize(img,1000)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faceCase=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
faces=faceCase.detectMultiScale(gray,scaleFactor=1.05,minNeighbors=9,minSize=(8,8))
print('数目{}'.format(len(faces)))
print('坐标',faces)
for (x,y,w,h) in faces:
    cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
cv2.imshow('result',img)
cv2.waitKey(0)

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

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

相关文章

CodeActAgent :Executable Code Actions Elicit Better LLM Agents解读

论文地址 https://arxiv.org/pdf/2402.01030.pdf 项目地址 https://github.com/svjack/CodeActAgent-Gradio/blob/main/README.md 代码智能体的优势 选择代码智能体有以下几个关键原因,它们相较于使用类似JSON的字典输出具有显著优势: 1. 代码的高…

Spring Boot 应用开发:入门与实战

Spring Boot 应用开发:入门与实战 引言 Spring Boot 是 Spring 框架的一个子项目,旨在简化 Spring 应用的配置和开发。它通过自动配置和嵌入式服务器,极大地简化了 Java 企业级应用的开发。本文将详细介绍 Spring Boot 的核心概念&#xff…

【SPIE独立出版】第四届计算机、信息工程与电子材料国际学术会议 (CTIEEM 2024,2024年11月15-17日 )

第四届计算机、信息工程与电子材料国际学术会议 (CTIEEM 2024) The 4th International Conference on Computer Technology, Information Engineering and Electron Materials 会议官网:www.ctieem.org The 4th International Conference on Computer Technology,…

【bug】paddleocr draw_ocr_box_txt ValueError: incorrect coordinate type

【bug】paddleocr draw_ocr_box_txt ValueError: incorrect coordinate type 环境 python 3.10.15pillow 10.4.0 paddleocr 2.8.1错误详情 错误文本 Traceback (most recent call last):....draw_left.polygon(box, fillcolor)ValueError: inco…

浏览器内置文字转语音,播报功能Web Speech API - SpeechSynthesisUtterance

SpeechSynthesisUtterance: 让网页说话的艺术 在现代Web开发中,让网页具有语音功能可以极大提升用户体验,特别是对于视障用户或需要多任务处理的场景。SpeechSynthesisUtterance 是 Web Speech API 中的一个接口,它允许开发者创建一个语音合…

穷举vs暴搜vs深搜vs回溯vs剪枝(一)

文章目录 全排列子集找出所有子集的异或总和再求和全排列 II电话号码的字母组合 全排列 题目:全排列 思路 通过深度优先搜索的方式,不断枚举每个数在当前位置的可能性,然后回溯到上一个状态,直到枚举完所有可能性得到正确的结果 r…

SDK5(note上)

以下代码实现菜单窗口和快捷键的ctrlo打开的操作 #include <windows.h> #include<tchar.h> #include <stdio.h> #include <strsafe.h> #include <string> #define IDM_OPEN 102 /*鼠标消息 * 键盘消息 * Onkeydown * Onkeyup * //键盘扫描码 * …

力扣hot100--二叉树

目录 二叉树 1. 94. 二叉树的中序遍历 2. 98. 验证二叉搜索树 3. 101. 对称二叉树 4.102. 二叉树的层序遍历 5. 104. 二叉树的最大深度 6. 105. 从前序与中序遍历序列构造二叉树 7. 114. 二叉树展开为链表 8. 226. 翻转二叉树 9. 236. 二叉树的最近公共祖先 二叉树 …

操作符详解(C 语言)

目录 一、操作符的分类二、算数操作符1. 除法操作符2. 取余操作符 三、位移操作符1. 进制2. 原码、反码和补码3. 左移操作符&#xff08;<<&#xff09;和右移操作符&#xff08;>>&#xff09; 四、位操作符1. 按位与 &2. 按位或 |3. 按位异或 ^4. 按位取反 ~…

大衍数列——考研408考试科目之数据算法——未来之窗学习通

一、大衍数列 中国古代文献中&#xff0c;曾记载过“大衍数列”, 主要用于解释中国传统文化中的太极衍生原理。 它的前几项是&#xff1a;0、2、4、8、12、18、24、32、40、50 … 其规律是&#xff1a;对偶数项&#xff0c;是序号平方再除2&#xff0c;奇数项&#xff0c;是…

有源滤波器(三)

这个连接方法很可以&#xff0c;正好解决了最近没有转接器的问题&#xff1a;

javaweb-xml映射文件编写sql语句

可以使用注解的方式&#xff0c;也可以使用xml映射的方式&#xff0c;一般简单sql语句使用注解&#xff0c;复杂的使用xml映射。

【PhpSpreadsheet】ThinkPHP5+PhpSpreadsheet实现批量导出数据

目录 前言 一、安装 二、API使用 三、完整实例 四、效果图 前言 为什么使用PhpSpreadsheet&#xff1f; 由于PHPExcel不再维护&#xff0c;所以建议使用PhpSpreadsheet来导出exlcel&#xff0c;但是PhpSpreadsheet由于是个新的类库&#xff0c;所以只支持PHP7.1及以上的版…

【文心智能体 | AI大师工坊】如何使用智能体插件,完成一款购物类智能体的开发,来体验一下我的智能体『科技君Tom』

目录 1.1、智能体运行效果1.2、创作灵感来源智能体平台拥有个人化且人性化的大致框架&#xff0c;可以让小白也能搭建出一个智能体其次是拥有丰富的插件&#xff0c;可以更加快速的得到自己想要的效果~ 1.3、如何制作智能体常见问题与解决方案关于人设与回复逻辑插件使用模型的…

【黑马redis高级篇】持久化

//来源[01,05]分布式缓存 除了黑马&#xff0c;还参考了别的。 目录 1.单点redis问题及解决方案2.为什么需要持久化&#xff1f;3.Redis持久化有哪些方式呢&#xff1f;为什么我们需要重点学RDB和AOF&#xff1f;4.RDB4.1 定义4.2 触发方式4.2.1手动触发save4.2.2被动触发bgsa…

文件IO(Linux文件IO,目录操作函数)

前言 本文介绍Linux系统下自带的文件IO的函数。 Linux文件IO相关函数 open函数 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode)…

2024ideaUI切换和svn与git的切换

2024的UI实在很不舒服&#xff0c;隐藏了很多按键&#xff1b; 第一步&#xff1a; 视图 -》 外观 -》 工具栏选出来&#xff1b; 结果出来&#xff1a; 运行的按键和设置的按钮 第二步 点击设置的按钮&#xff0c;选择最后一个&#xff0c;重启就行 结果 舒服&#xff01; s…

双通道音频功率放大电路D2822M兼容TDA2822,全封装输出功率0.11W,用于音频产品

在某客户的便携式音频产品中&#xff0c;客户想在确保其产品的性能的前提下&#xff0c;为产品方案寻找一颗国产备份料。客户产品之前使用的是TDA2822&#xff0c;在了解客户的电路设计以及该产品的电气特性后&#xff0c;给客户寻找了一款可兼容相同电路设计使用的国产厂牌芯谷…

2010年国赛高教杯数学建模C题输油管的布置解题全过程文档及程序

2010年国赛高教杯数学建模 C题 输油管的布置 某油田计划在铁路线一侧建造两家炼油厂&#xff0c;同时在铁路线上增建一个车站&#xff0c;用来运送成品油。由于这种模式具有一定的普遍性&#xff0c;油田设计院希望建立管线建设费用最省的一般数学模型与方法。   1. 针对两炼…

Python零基础01——Python的由来,Python的特点、优缺点有哪些?

文章目录 Python的由来Python的特点Python的优缺点什么是编译器 Python的由来 1989年圣诞节期间&#xff0c;在阿姆斯特丹为打发圣诞节的无趣&#xff0c;决定开发一款新的脚本解释语言&#xff0c;作为ABC语言的一种继承&#xff0c;然后他就这么做了&#xff0c;并实现了&am…