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 imageif 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 imageif 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)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac 需要杀毒软件?

大部分 mac用户普遍认为 Apple mac 不受病毒和恶意软件的影响。这导致许多 Mac 用户误以为无需为 Mac 安装防病毒软件,但事实并非如此。 在这篇文章中,将深入探讨 Mac 安全性的细节,探索针对 Apple 设备的恶意软件类型,并为您…

Python和CUDA(C++)量子退火和伊辛二次算法模型

🎯要点 简化量子退火或离散优化算法处理,使用张量网络模拟和动态系统方法及神经网络逼近。实现并行退火算法和CUDA支持下穷举搜索法。使用大都会算法模拟二维自旋玻璃伊辛模型并测量磁化率、比热容和能量。对比其他组合优化解方法,使用英伟达…

Windows 安装 Maven 并配置环境变量

一、简介 Maven 是一款基于 Java 平台的项目管理和整合工具,用来构建项目的。也就是清理、编译、测试、运行、打包、安装整个过程都交给 Maven 管理,整个过程就是构建。 二、安装 Java JDK Maven 依赖 Java JDK,如果本机没有安装过 Java 的…

CRM客户关系管理系统的功能、作用、特点有哪些?

大家都知道,CRM是销售常用的客户关系管理系统。销售是客户关系管理系统中的主要组成部分,主要包括潜在客户、客户、联系人、业务机会、订单、回款单、报表统计图等模块。那么CRM只能销售人员用来管理客户关系吗? 其实,CRM的功能远…

HUAWEI_HCIA_实验指南_Lib2.1_交换机基础配置

1、原理概述 交换机之间通过以太网电接口对接时需要协商一些接口参数,比如速率、双工模式等。交换机的全双工是指交换机在发送数据的同时也能够接收数据,两者同时进行。就如平时打电话一样,说话的同时也能够听到对方的声音。而半双工指在同一…

开发日志:IIS安全配置

为了解决IIS文件路径泄漏问题,可以采取以下措施: 一. 详细操作 1. CMD关闭NTFS 8.3文件格式的支持 命令行:fsutil 8dot3name set 1 2. 修改注册表禁用短文件名功能 CMD输入regedit回车,在注册表中找到HKEY_LOCAL_MACHINE\SYSTEM\C…

离职跳槽,不要上了这些当!

在离职跳槽的过程中,许多人可能会遇到各种陷阱和误导,这些不当行为不仅会影响个人的职业发展,还可能带来经济损失和法律风险。以下是一些常见的离职跳槽陷阱及应对策略,帮助你避免上当。 一、离职前的陷阱 1. 盲目冲动离职 现象…

uniapp学习(005-1 详解Part.1)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战,开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第36p-第p40的内容 文章目录 响应式尺寸单位 rpx各种工具修改ui给的图片的宽度ps操作步骤即时设计操作步骤&…

Cherno游戏引擎笔记(61~72)

---------------一些维护和更改------------- 》》》》 Made Win-GenProjects.bat work from every directory 代码更改: echo off->pushd ..\->pushd %~dp0\..\call vendor\bin\premake\premake5.exe vs2019popdPAUSE 为什么要做这样的更改? …

Caffeine+Redis两级缓存架构

CaffeineRedis两级缓存架构 在高性能的服务项目中,我们一般会将一些热点数据存储到 Redis这类缓存中间件中,只有当缓存的访问没有命中时再查询数据库。在提升访问速度的同时,也能降低数据库的压力。 但是在一些场景下单纯使用 Redis 的分布…

Redis登录校验

登录拦截器 第一个拦截器只是确保一切请求都要进行token刷新的大动作 第二个拦截器从ThreadLocal中获取user用户 缓存一致性如何解决 并发情况下发生缓存不一致的问题,主要是因为写数据库和写缓存不是原子的 先写缓存,再写数据库 先写数据库&#xff…

Linux下Git操作

一、基本命令 1、创建 git 目录(工作区) mkdir gitcode 2、创建本地仓库,生成 .git 隐藏目录 git init 3、设置配置项 git config user.name "xxx" git config user.email "....." 4、查看配置项 git config -l …

QD1-P14 HTML 输入标签(input)

本节学习 HTML 常用标签&#xff1a;input 输入标签 ‍ 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p14 ‍ 知识点 1&#xff1a;简单示例 HTML <!DOCTYPE html> <html><head><meta charset"utf-8"><title>P14-input标签<…

在中国使用AWS服务器的法律要求与注册公司问题

随着云计算技术的迅猛发展&#xff0c;亚马逊网络服务&#xff08;AWS&#xff09;逐渐成为企业和开发者的首选平台。然而&#xff0c;当涉及到在中国境内使用AWS服务器时&#xff0c;许多人会关注一个重要问题&#xff1a;是否需要注册公司才能在中国运营AWS服务器&#xff1f…

Elasticsearch 实战应用

Elasticsearch 实战应用 引言 Elasticsearch 是一个分布式、RESTful 风格的搜索和分析引擎&#xff0c;能够快速、实时地处理大规模数据&#xff0c;广泛应用于全文搜索、日志分析、推荐系统等领域。在这篇博客中&#xff0c;我们将从 Elasticsearch 的基本概念入手&#xff…

【华为】配置BGP协议

边界网关协议BGP是一种实现自治系统AS之间的路由可达&#xff0c;并选择最佳路由的距离矢量路由协议。BGP在不同自治系统之间进行路由转发&#xff0c;分为EBGP&#xff08;外部边界网关协议&#xff09;和IBGP&#xff08;内部边界网关协议&#xff09;两种情况。 [A]in g0/0/…

《Windows PE》5.2 遍历导出表

为了将程序读到内存指定位置&#xff0c;本节我们将讨论如何使用两种不同的方法遍历导出表。此外&#xff0c;我们还将给出一个打印进程调用kernel32中的API信息的示例程序。 本节必须掌握的知识点&#xff1a; 遍历导出表 打印kernel32 5.2.1 遍历导出表 ■方法一 实验三十四…

【Vue.js】vue2 项目在 Vscode 中使用 Ctrl + 鼠标左键跳转 @ 别名导入的 js 文件和 .vue 文件

js 文件跳转 需要安装插件 Vetur 然后需要我们在项目根目录下添加 jsconfig.json 配置&#xff0c;至于配置的作于&#xff0c;可以参考我的另外一篇博客&#xff1a; 【React 】react 创建项目配置 jsconfig.json 的作用 它主要用于配置 JavaScript 或 TypeScript 项目的根…

C++ | Leetcode C++题解之第475题供暖器

题目&#xff1a; 题解&#xff1a; class Solution { public:int findRadius(vector<int>& houses, vector<int>& heaters) {sort(houses.begin(), houses.end());sort(heaters.begin(), heaters.end());int ans 0;for (int i 0, j 0; i < houses.…

华为---MUX VLAN简介及示例配置

目录 1. 产生背景 2. 应用场景 3. 主要功能 4. 基本概念 5. 配置步骤及相关命令 6.示例配置 6.1 示例场景 6.2 网络拓扑图 6.3 配置代码 6.4 配置及解析 6.5 测试验证 配置注意事项 1. 产生背景 MUX VLAN&#xff08;Multiplex VLAN&#xff09;提供了一种通过VLA…