018 OpenCV 人脸检测

目录

一、环境

二、分类器原理

2.1、概述

2.2、工作原理

三、人脸检测代码


一、环境

本文使用环境为:

  • Windows10
  • Python 3.9.17
  • opencv-python 4.8.0.74

二、分类器原理

CascadeClassifier是OpenCV(开源计算机视觉库)中的一个强大的类,用于实现级联分类器。这是一种机器学习技术,广泛应用于面部检测、物体识别等计算机视觉任务。以下是对CascadeClassifier的深入解析。

2.1、概述

在计算机视觉中,目标检测是一个重要的任务,其目标是在图像或视频中找出感兴趣的对象。对于人脸检测,我们需要从图像中找出并定位所有的人脸。为了完成这个任务,我们需要一个强大的分类器。然而,构建一个强大且高效的分类器是一个挑战,因为我们需要处理大量的数据,并且需要在各种条件下(不同的光照、姿态、表情等)都能准确地检测出人脸。

这就是CascadeClassifier发挥作用的地方。CascadeClassifier是一个级联分类器,它结合了多个“弱”分类器来创建一个强大的分类器。每个弱分类器都基于Haar特征或LBP(局部二值模式)特征。这些特征都是图像中的简单模式,可以用来描述图像的结构。通过结合这些弱分类器,我们可以得到一个能在各种条件下都能准确检测出人脸的强分类器。

2.2、工作原理

CascadeClassifier的工作原理可以分为两个阶段:训练和检测。

  1. 训练阶段:在这个阶段,我们需要提供大量的正样本(包含目标的图像)和负样本(不包含目标的图像)。然后,CascadeClassifier使用AdaBoost算法来训练分类器。AdaBoost算法通过迭代地增加错误分类的样本的权重来优化分类器的性能。这个过程会产生一系列的弱分类器,每个弱分类器都对一部分样本有很好的分类效果。然后,这些弱分类器被组合成一个强分类器。
  2. 检测阶段:在检测阶段,CascadeClassifier使用滑动窗口的方法来扫描图像。对于每个窗口,分类器都会计算一个分数,表示该窗口包含目标的可能性。然后,这个分数与一个阈值进行比较,如果分数高于阈值,那么这个窗口就被认为包含目标。这个过程会在不同的尺度和位置上重复进行,以便检测出不同大小和位置的目标。

三、人脸检测代码

代码需要一张图片,两个xml文件,文件我给出来了,

链接:https://pan.baidu.com/s/1cvPvhhuYD_KXHVVaG9dEng?pwd=1234 
提取码:1234

以下代码中,先读取一张图片,然后读取两个xml文件(模型文件)。接着在原图上检测人脸,再将人脸区域图片用于检测眼睛。

from __future__ import print_function
import cv2 as cv
import argparse# 可视化
def detectAndDisplay(frame):# 彩色图转灰度图frame_gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)# 使用直方图均衡化算法处理灰度图,防止图像太亮或者太暗frame_gray = cv.equalizeHist(frame_gray)# 人脸检测faces = face_cascade.detectMultiScale(frame_gray)for (x,y,w,h) in faces:center = (x + w//2, y + h//2)# 将人脸用椭圆标注出来frame = cv.ellipse(frame, center, (w//2, h//2), 0, 0, 360, (255, 0, 255), 4)# 取出人脸roi小图faceROI = frame_gray[y:y+h,x:x+w]# 在人脸roi小图上识别眼睛eyes = eyes_cascade.detectMultiScale(faceROI)for (x2,y2,w2,h2) in eyes:eye_center = (x + x2 + w2//2, y + y2 + h2//2) # 眼睛中心radius = int(round((w2 + h2)*0.25)) # 圆半径frame = cv.circle(frame, eye_center, radius, (255, 0, 0 ), 4) # 使用圆将眼睛圈出来cv.imshow('Capture - Face detection', frame)parser = argparse.ArgumentParser(description='Code for Cascade Classifier tutorial.')
# 人脸模型路径
parser.add_argument('--face_cascade', help='Path to face cascade.', default='data/haarcascades/haarcascade_frontalface_alt.xml')
# 眼睛模型路径
parser.add_argument('--eyes_cascade', help='Path to eyes cascade.', default='data/haarcascades/haarcascade_eye_tree_eyeglasses.xml')
parser.add_argument('--image', help='image path', type=str, default='data/6.jpg') 
args = parser.parse_args()face_cascade_name = args.face_cascade
eyes_cascade_name = args.eyes_cascade
# 创建一个级联分类器对象(人脸)
face_cascade = cv.CascadeClassifier()
# 创建一个级联分类器对象(眼睛)
eyes_cascade = cv.CascadeClassifier()#加载级联分类器参数文件(人脸)
if not face_cascade.load(cv.samples.findFile(face_cascade_name)):print('--(!)Error loading face cascade')exit(0)
#加载级联分类器参数文件(眼睛)
if not eyes_cascade.load(cv.samples.findFile(eyes_cascade_name)):print('--(!)Error loading eyes cascade')exit(0)img_path = args.image
#头读取图像
frame = cv.imread(img_path)
detectAndDisplay(frame)
cv.waitKey(0)

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

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

相关文章

孜然地址引导页V9(带后台)

刚刚在浏览之前经常访问的网站的时候我发现他不用那个域名了,然后我见这个页面好看,就把他干下来了,然后把给他写了个后台。另外如果你的子页面收录多的话,人家百度访问你的子页面会显示404的,所以为了流量可观安装这个…

销售技巧培训之如何提升导购员销售技巧

销售技巧培训之如何提升导购员销售技巧 导购员是门店的重要组成部分,他们的销售技巧直接影响到商店的业绩。因此,提升导购员的销售技巧是商店管理的重要任务。 一、建立良好的沟通 良好的沟通是导购员成功的关键。导购员需要与顾客建立良好的关系&…

归并排序与自然归并排序

归并排序 归并排序(merge - sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用.将已有的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序.若将两个有序表合并成一个有序表,成为二路归并. 核心步骤讲解 归并排序的…

使用Notepad++编辑器,安装compare比较差异插件

概述 是一款非常有特色的编辑器,Notepad是开源软件,Notepad中文版可以免费使用。 操作步骤: 1、在工具栏 ->“插件”选项。 2、勾选Compare选项,点击右上角“安装”即可。 3、 确认安装插件 4、下载插件 5、插件已安装 6、打…

企业微信应用模板消息

是在发送应用消息接口的基础上,第三方应用支持一种新的消息类型:模板消息,msgtype指定为template_msg。模板消息是一种固定格式的消息。 注意 - 此消息类型目前仅第三方应用支持,自建应用不支持。服务商需在管理端申请模版。接口…

吉祥物IP怎么结合动捕设备应用在线下活动?

一个好的吉祥物IP,不仅可以为品牌带来传播效果和形象具体化的价值,还可以带来一系列的商业利益。 当吉祥物IP接入惯性动作捕捉系统,即可由真人幕后穿戴动捕设备进行实时驱动,可以通过虚拟数字人直播、数字人短视频、数字人线下活动…

2024 年勒索软件:预期影响、目标和格局变化

随着勒索软件持续增加,我们可以预期这些组织 将继续改进其攻击方式并进行更大规模的操作以获取更大的利润。 如果组织不采取更积极的安全策略,就会面临更高的风险。 以下是我们预计 2024 年勒索软件的情况。 2024 年,我们将看到更多大规模…

JavaScript <关于逆向RSA非对称加密算法的案例(附原代码)>--案例(五)

前言: 趁热打铁,标记一下RSA的算法逆向...第二篇会有详解(本篇重在过程) 正文: 废话不说,直接分析步骤图: 到了这里,可以看到在登录的时候,需要验证码(本篇不教反验证码) 下面是正题--->逆他的pwd(密码) 总结: 问题:怎么确定一个密文数据是基于什么算法做出来的呢? 答:…

Android笔记(十七):PendingIntent简介

PendingIntent翻译成中文为“待定意图”,这个翻译很好地表示了它的涵义。PendingIntent描述了封装Intent意图以及该意图要执行的目标操作。PendingIntent封装Intent的目标行为的执行是必须满足一定条件,只有条件满足,才会触发意图的目标操作。…

OpenAI承认ChatGPT变懒惰,正在修复该问题

OpenAI旗下的官方ChatGPT账号在社交平台表示,已经收到了大量用户关于GPT-4变懒惰的反馈。 这是因为自11月11日以来,OpenAI就没有更新过该模型。当然这不是故意的,大模型的行为是不可预测的,正在研究修复该问题。 外界猜测&#x…

[ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证

文章目录 一、前言二、在 Azure Portal 中创建 VM三、验证已创建的虚拟机资源3.1 方法一:在虚拟机服务中查看验证3.1 方法二:在资源组服务中查看验证 四、文末总结 一、前言 本文会开始创建新系列的专栏,专门更新 Azure 云实践相关的文章。 …

Spring AOP从入门到精通

目录 1. AOP的演化过程 1. 代理模式 2. 动态代理 2.1 JDK动态代理 2.2 Cglib动态代理 3. Spring模式 3.1 ProxyFactory 3.2 ProxyFactoryBean 3.3 AbstractAutoProxyCreator 2. Spring AOP抽象 1. 核心术语 1.1 连接点(JoinPoint) 1.2 切点(Pointcut) 1.3 增强(Ad…

每天五分钟计算机视觉:使用1*1卷积层来改变输入层的通道数量

本文重点 在卷积神经网络中有很多重要的卷积核,比如1*1的卷积核,3*3的卷积核,本文将讲解1*1的卷积核的使用,它在卷积神经网络中具有重要的地位。由于1*1的卷积核使用了最小的窗口,那么1*1的卷积核就失去了卷积层可以识…

《使用ThinkPHP6开发项目》 - 创建应用

《使用ThinkPHP6开发项目》 - 安装ThinkPHP框架-CSDN博客 《使用ThinkPHP6开发项目》 - 设置项目环境变量-CSDN博客 《使用ThinkPHP6开发项目》 - 项目使用多应用开发-CSDN博客 根据前面的步骤,我们现在就可以开发我们的项目开发了,根据项目开发的需要…

SAP UI5 walkthrough step9 Component Configuration

在之前的章节中,我们已经介绍完了MVC的架构和实现,现在我们来讲一下,SAPUI5的结构 这一步,我们将所有的UI资产从index.html里面独立封装在一个组件里面 这样组件就变得独立,可复用了。这样,无所什么时候我…

mjpg-streamer配置其它端口访问视频

环境 树莓派4B ubuntu 20.04 U口摄像头 确认摄像头可访问 lsusb查看 在dev下可查看到video* sudo mplayer tv://可打开摄像头并访问到视频 下载mjpg-streamer并编译安装 在github下载zip包,下载的源码,需要编译安装 unzip解压 cd mjpg-streamer/mjp…

【lesson3】数据库表的操作

文章目录 创建修改修改表名增加表类型修改表的某一类型的类型修改表某一类型的类型名 删除删除表的某一列删除表 查看查看表信息查看表内容 创建 建表指令: 查看是否建表成功: 查看表的具体信息: 修改 修改表名 法一:修改…

【Spring教程25】Spring框架实战:从零开始学习SpringMVC 之 SpringMVC入门案例总结与SpringMVC工作流程分析

目录 1.入门案例总结2. 入门案例工作流程分析2.1 启动服务器初始化过程2.2 单次请求过程 欢迎大家回到《Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《如何在windows11下安装Mave…

分层网络模型(OSI、TCP/IP)及对应的网络协议

OSI七层网络模型 OSI(Open System Interconnect),即开放式系统互连参考模型, 一般都叫OSI参考模型,是ISO组织于1985年研究的网络互连模型。OSI是分层的体系结构,每一层是一个模块,用于完成某种功…

hook其他调试技巧

输出堆栈信息 通过 android.util.Log 输出当前线程的堆栈跟踪信息。 function showStacks() {Java.perform(function () {console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new() )); }) } 可以在需要的…