使用openvc进行人脸检测:Haar级联分类器
1 人脸检测介绍
1.1 什么是人脸检测
人脸检测的目标是确定图像或视频中是否存在人脸。如果存在多个面,则每个面都被一个边界框包围,因此我们知道这些面的位置
人脸检测算法的主要目标是准确有效地确定图像或视频中人脸的存在和位置。这些算法分析数据的视觉内容,搜索与面部特征相对应的模式和特征。通过采用机器学习、图像处理和模式识别等各种技术,人脸检测算法旨在将人脸与视觉数据中的其他对象或背景元素区分开来。
人脸很难建模,因为有许多变量可以改变,例如面部表情、方向、照明条件以及太阳镜、围巾、口罩等部分遮挡。检测结果给出了面部位置参数,并且可以要求有多种形式,例如覆盖面部中央部分、眼睛中心或包括眼睛、鼻子和嘴角、眉毛、鼻孔等的标志的矩形。
1.2 Haar级联分类器
人脸检测是计算机视觉中的一个重要任务,在现实生活中有着广泛的应用价值。Haar级联分类器是OpenCV中实现人脸检测其中一种算法,它通过分析相邻图像区域之间的对比度,确定给定图像或子图像是否与已知类型匹配。我们来考虑如何在层次结构中组合多个Haar级联分类器,以便用一个分类器识别父区域(就目标而言是一张人脸),用其他分类器识别子区域(比如眼睛)。在OpenCV源代码的副本中会有一个文件夹data/haarcascades。该文件夹包含了所有OpenCV的人脸检测的XML文件,这些文件可用于检测静止图像、视频和摄像头所得到图像中的人脸。
从文件名可知这些级联是用于人脸、眼睛、鼻子和嘴的跟踪。这些文件需要正面、直立的人脸图像。创建人脸检测器时会使用这些文件,创建自己的级联,并训练这些级联来检测各种对象。
代码地址:https://github.com/opencv/opencv/tree/4.x/data/haarcascades
2 使用opencv进行人脸检测
在静态图像或视频中检测人脸的操作非常相似。视频人脸检测只是从摄像头读出每帧图像,然后采用静态图像中的人脸检测方法进行检测。当然,视频人脸检测还涉及其他的概念,例如跟踪,而静态图像中的人脸检测就没有这样的概念,但它们的基本理论是一致的。
2.1 静态图像人脸检测
检测步骤为读取静态图像,调用模型进行检测。
在OpenCV中,人脸检测使用的是cv2.CascadeClassifier.detectMultiScale()函数,它可以检测出图片中所有的人脸。
cv2.detectMultiScale(self, image, scaleFactor=None, minNeighbors=None, flags=None, minSize=None, maxSize=None)
参数:image: 输入图像, 灰度图;
scaleFactor: 图像尺寸缩小比例, 决定两个不同大小的窗口扫描之间有多大的跳跃;
minNeighbors: 被检测到几次才算目标;
minSize: 目标最小尺寸;
maxSize: 目标最大尺寸;
人脸检测代码:
import cv2image = cv2.imread('../data/girl01.jpg')
# 获取XML文件,加载人脸检测器
faceCascade = cv2.CascadeClassifier('../data/haarcascade_frontalface_default.xml')# 色彩转换,转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 调用函数detectMultiScale
faces = faceCascade.detectMultiScale(gray, scaleFactor=1.15, minNeighbors=5, minSize=(5, 5))
print(faces)
print("发现{0}个人脸!".format(len(faces)))
# 逐个标注人脸
for (x, y, w, h) in faces:cv2.rectangle(image, (x, y), (x+w, y+w), (0, 255, 0), 2)cv2.imshow("face", image)
cv2.imwrite("../data/detect_result.jpg", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
检测结果如下:
[[242 115 159 159]]
发现1个人脸!
人眼检测代码:
2.2 视频人脸检测
检测步骤为读取视频的每一帧图像,对每一帧图像逐一进行人脸检测
import cv2# 1.读取视频
cv2.namedWindow("CaptureFace")
cap = cv2.VideoCapture('../data/girl.mp4')# 2.人脸识别器分类器
classfier = cv2.CascadeClassifier('../data/haarcascade_frontalface_alt2.xml')
color = (0, 255, 0)while cap.isOpened():flag, frame = cap.read()frame = cv2.flip(frame, 1) # 镜像操作if not flag:break# 3.灰度转换grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 4.人脸检测,1.2和2分别为图片缩放比例和需要检测的有效点数facerects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))if len(facerects) > 0: # 大于0则检测到人脸for faceRect in facerects: # 单独框出每一张人脸x, y, w, h = faceRect# 5.画图cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 3)cv2.imshow("CaptureFace", frame)if cv2.waitKey(10) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()
运行结果显示如下:
2.3 摄像头人脸检测
检测步骤为打开摄像头,捕获摄像头的每一帧数据,针对每一帧数据进行检测
import cv2# 1.调用摄像头
cv2.namedWindow("CaptureFace")
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)# 2.人脸识别器分类器
classfier = cv2.CascadeClassifier('../data/haarcascade_frontalface_alt2.xml')
color = (0, 255, 0)while cap.isOpened():flag, frame = cap.read()frame = cv2.flip(frame, 1) # 镜像操作if not flag:break# 3.灰度转换grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 4.人脸检测,1.2和2分别为图片缩放比例和需要检测的有效点数facerects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))if len(facerects) > 0: # 大于0则检测到人脸print('检测到人脸')for faceRect in facerects: # 单独框出每一张人脸x, y, w, h = faceRect# 5.画图cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 3)cv2.imshow("CaptureFace", frame)if cv2.waitKey(10) & 0xFF == ord('q'):break
检测到人脸
检测到人脸
检测到人脸
检测到人脸
检测到人脸
检测到人脸
相关文章:

使用openvc进行人脸检测:Haar级联分类器
1 人脸检测介绍 1.1 什么是人脸检测 人脸检测的目标是确定图像或视频中是否存在人脸。如果存在多个面,则每个面都被一个边界框包围,因此我们知道这些面的位置 人脸检测算法的主要目标是准确有效地确定图像或视频中人脸的存在和位置。这些算法分析数据…...
Netty心跳检测
文章目录 一、网络连接假死现象二、服务器端的空闲检测三、客户端的心跳报文 客户端的心跳检测对于任何长连接的应用来说,都是一个非常基础的功能。要理解心跳的重要性,首先需要从网络连接假死的现象说起。 一、网络连接假死现象 什么是连接假死呢&…...

【leaflet】1. 初见
▒ 目录 ▒ 🛫 导读需求开发环境 1️⃣ 概念概念解释特点 2️⃣ 学习路线图3️⃣ html示例🛬 文章小结📖 参考资料 🛫 导读 需求 要做游戏地图了,看到大量产品都使用的leaflet,所以开始学习这个。 开发环境…...
数据结构与算法(Java版) | 详解十大经典排序算法之一:冒泡排序
前面虽然大家已经知道了多种不同的排序算法,但是我一直都没来得及给大家讲,所以,从这一讲起,我就要开始来给大家详细讲解具体的这些排序算法了。 下面,我们先来看第一个最常见的排序,即冒泡排序。 冒泡排…...
轻量封装WebGPU渲染系统示例<24>- Rendering Pass Graph基本用法(源码)
当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/PassNodeGraphTest.ts 此示例基于此渲染系统实现,当前示例TypeScript源码如下: class PassGraph extends WGRPassNodeGraph {constructor() { super();…...

开设自己的网站系类01购买服务器
开始建设自己的网站吧! 编者买了一个服务器打算自己构建一个网站,用于记录生活。网站大概算是一个个人博客吧。记录创建过程的一些步骤 要开设自己的网站,需要执行以下关键步骤 以下只是初步列出了建立自己的网站的大概步骤,后…...

FTP、NFS、SAMBA系统服务一
一、rsync托管xinetd 1、为什么要进行服务托管 独立服务:独立启动脚本 ssh ftp nfs dns ... 依赖服务: 没有独立的启动脚本 rsync telnet 依赖xinetd服务(独立服务) 2、如何将rsync托管给xinetd服务去管理? 第一步࿱…...

transfomer模型——简介,代码实现,重要模块解读,源码,官方
一、什么是transfomer Transformer是一种基于注意力机制(attention mechanism)的神经网络架构,最初由Vaswani等人在论文《Attention Is All You Need》中提出。它在自然语言处理(NLP)领域取得了巨大成功,特…...
队列(Queue):先进先出(FIFO)的数据结构
队列是一种基本的数据结构,用于在计算机科学和编程中管理数据的存储和访问。队列遵循先进先出(First In, First Out,FIFO)原则,即最早入队的元素首先出队。这种数据结构模拟了物理世界中的队列,如排队等待服…...

吃透 Spring 系列—AOP部分
目录 ◆ AOP 简介 - AOP的概念 - AOP思想的实现方案 - 模拟AOP的基础代码 - AOP相关概念 ◆ 基于xml配置的AOP - xml方式AOP快速入门 - xml方式AOP配置详解 - xml方式AOP原理剖析 ◆ 基于注解配置的AOP - 注解方式AOP基本使用 - 注解方式AOP配置详解 - 注解…...
redis 问题解决 2
1.4 数据存储 1、Redis 的数据过期策略是什么? Redis的数据过期策略包括两种机制:被动删除和主动删除。 被动删除: 当某个键被访问时,如果发现这个键已经过期,Redis会立即删除这个键。这意味着如果一个过期的键从未被访问,它就不会被自动删除。这是一种惰性删除策略。主…...
Spring Boot 校验用户上传的图片文件
图片上传是现代应用中非常常见的一种功能,也是风险比较高的一个地方。恶意用户可能会上传一些病毒、木马。这些东西不仅严重威胁服务器的安全还浪费了带宽,磁盘等资源。所以,在图片上传的接口中,一定要对用户上传的文件进行严格的…...

【springboot配置项动态刷新】与【yaml文件转换为java对象】
文章目录 一,序言二,准备工作1. pom.xml引入组件2. 配置文件示例 三,自定义配置项动态刷新编码实现1. 定义自定义配置项对象2. 添加注解实现启动时自动注入3. 实现yml文件监听以及文件变化处理 四,yaml文件转换为java对象1. 无法使…...

JS移动端触屏事件
在我们PC端中有许多的事件,那我们在移动端有没有事件呢?让我为大家介绍一下移动端常用的事件,触屏事件 触屏事件 touch (也称触摸事件),Android 和IOS 都有 touch 对象代表一个触摸点。触摸点可能是一根手指,也可能是一…...

C语言——打印1000年到2000年之间的闰年
闰年: 1、能被4整除不能被100整除 2、能被400整除 #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int year;for(year 1000; year < 2000; year){if((year%4 0) && (year%100!0) || (year%400 0)){printf("%d ",ye…...
【Linux】【驱动】设备树下的paltform总线
【Linux】【驱动】设备树下的paltform总线 1. 驱动程序的完整代码2. 使用到的相关函数3 使用到的指令3.2 设备上使用的指令 1. 驱动程序的完整代码 主要是展示了通过总线上挂载的方式来实现相关的数据读取 实质上就是几个of函数的调用。 /** Author: topeet* Description: 设…...
洛谷 NOIP 2023 模拟赛-汪了个汪-题解
简要题意 棋盘上有 n n n 行,第 i i i 行有 i i i 个格子。你要在格子填 1 ∼ n 1\sim n 1∼n,满足: 每行第一个数互不相同所有在行上相邻的两个数所组成的无序对互不相同每行的数互不相同 n ≤ 4000 n\le4000 n≤4000 题解 容易发现…...
洛谷 NOIP 2023 模拟赛 P9836 种树
洛谷 NOIP 2023 模拟赛 P9836 种树 文章目录 洛谷 NOIP 2023 模拟赛 P9836 种树题目大意思路code 题目大意 路边有 n n n 棵树,每棵树的 高度 均为正整数,记作 p 1 , p 2 … p n p_1, p_2 \dots p_n p1,p2…pn。 定义一棵树的 宽度 为它高度的…...

链表经典OJ题(链表回文结构,链表带环,链表的深拷贝)
目录 前言 1.反转一个单链表。 2. 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。 3.链表的回文结构。 4.链表带环问题(*****) 4.1是否带环 4.2 入环的节点 5.随机链表的复制(链表的深拷贝) 前言…...

AD教程 (十三)常见CHIP封装的创建
AD教程 (十三)常见CHIP(贴片)封装的创建 PCB封装是电子设计图纸和实物之间的映射体,具有精准数据的要求,在实际设计中需要通过规格书获取创建封装的数据参数。 PCB封装和实物的大小一致。PCB封装是承载实物…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...