OpenCv高阶(十三)——人脸检测

请添加图片描述

文章目录

  • 前言
  • 一、人脸检测—haar特征
  • 二、人脸检测---级联分类器
    • 1、级联分类器
    • 2、如何训练级联分类器
    • 3、已存在的级联分类器
  • 三、代码分析
    • 1、人脸检测的简单使用
    • 2、人脸微笑检测
      • (1) 初始化视频源
      • (2)主循环处理每一帧
      • (3) 加载分类器
      • (4)人脸检测
      • (5)人脸标注与微笑检测
      • (6)显示与退出控制
  • 总结


前言

在人工智能技术飞速发展的今天,计算机视觉(Computer Vision)正悄然改变我们的生活。从手机解锁到安防监控,从虚拟美颜到人机交互,人脸检测(Face Detection)作为这一领域的核心技术,始终扮演着“第一双眼睛”的角色。它不仅是理解人类身份、表情与行为的关键入口,更是迈向更复杂视觉任务(如人脸识别、姿态分析)的基石。
要实现人脸识别首先要判断当前图像中是否出现了人脸,这就是人脸检测。只有检测到图像中出现了人脸,才能据此判断这个人到底是谁。

一、人脸检测—haar特征

调用 OpenCV 中训练好的分类器实现人脸检测。OpenCV 提供了训练好的haar级联分类器,OpenCV 还提供了使用 HOG 特征(主要用于行人检测)和 LBP 算法的级联分类器。
在这里插入图片描述
特征值 = ∑特征区域中白色区域的像素值-黑色区域像素值
Haar特征反映的是图像的灰度变化

关于 Harr 特征中的矩形框,有如下 3 个变量:
• 矩形框位置: 矩形框要逐像素点地划过(遍历) 整个图像获取每个位置的特征值。
• 矩形框大小: 矩形的大小可以根据需要进行任意调整。
• 矩形框类型: 包含垂直、水平、对角等不同类型。

二、人脸检测—级联分类器

在这里插入图片描述

1、级联分类器

分类器需要对图像的多个特征进行识别。例如,在识别一个动物是狗(正类)还是其他动物(负类)时,直接根据多个条件进行判断,流程是非常烦琐的。如果先判断该动物有几条腿。有四条腿的动物被判断为可能为狗,并对此范围内的对象继续进行分析和判断。没有四条腿的动物直接被否决,即不可能是狗。只通过比较腿的数目就能排除样本集中大量的负类(如鸡、鸭、鹅等不是狗的动物的实例)。级联分类器就是基于这种思路将多个简单的分类器按照一定的顺序级联而成的。

2、如何训练级联分类器

OpenCV 提供了opencv_createsamples.exe 和opencv_traincascade.exe 文件,这两个 exe 文件可以用来训练级联分类器。

3、已存在的级联分类器

训练级联分类器很耗时,如果训练的数据量较大,可能需要几天才能完成。OpenCV 提供了一些训练好的级联分类器供用户使用。这些分类器可以用来检测人脸、脸部特征(眼睛、鼻子)、人类和其他物体。这些级联分类器以XML 文件的形式存放在 OpenCV 源文件的 data 目录下,加载不同级联分类器的 XML 文件就可以实现对不同对象的检测。
cv2库中的人脸检测模型
外部库(external libraries)—>Lib->SitePackages->cv2->data
(1)
在这里插入图片描述
(2)
在这里插入图片描述
(3)
在这里插入图片描述
(4)可以将data中的文件复制一份到项目文件夹下
在这里插入图片描述

三、代码分析

1、人脸检测的简单使用

import cv2  # 导入OpenCV库# 加载预训练Haar级联模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')# 读取图像
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转换为灰度图# 检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1,  # 图像缩放因子(用于多尺度检测)minNeighbors=5    # 候选框保留阈值(值越大检测越严格)
)# 绘制矩形框
for (x, y, w, h) in faces:cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)  # 蓝色边框,线宽2像素cv2.imshow('Result', img)  # 显示结果
cv2.waitKey(0)            # 等待按键关闭窗口

在这里插入图片描述

2、人脸微笑检测

(1) 初始化视频源

import cv2
# cap = cv2.VideoCapture(r'../data/xiao.mp4')  # 从视频文件读取
cap = cv2.VideoCapture(0)  # 从摄像头读取(0表示默认摄像头)if not cap.isOpened():print("视频打开失败")exit()

关键点:

VideoCapture()支持视频文件路径或摄像头ID(0通常为内置摄像头)。

isOpened()检查视频源是否成功打开。

(2)主循环处理每一帧

while True:ret, frame = cap.read()frame = cv2.flip(frame, 1)  # 水平翻转(镜像效果)gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 转换为灰度图

关键点:

cap.read()返回ret(读取是否成功)和frame(当前帧图像)。

flip(1)实现水平镜像,适合自拍场景。

灰度转换减少计算量(Haar检测需要灰度输入)。

(3) 加载分类器

  faceCascade = cv2.CascadeClassifier(r'./myface-detect/haarcascade_frontalface_alt.xml')smiles = cv2.CascadeClassifier(r'./myface-detect/haarcascade_smile.xml')

重复加载分类器:每次循环都重新加载XML文件,浪费资源(应移出循环外)。

(4)人脸检测

faces = faceCascade.detectMultiScale(gray, scaleFactor=1.05, minNeighbors=14, minSize=(8,8))

参数分析:

scaleFactor=1.05:缩小比例较小(检测更细致但速度更慢)。

minNeighbors=14:较高的合并阈值(减少误检,但可能漏检密集人脸)。

minSize=(8,8):允许检测极小的人脸(可能导致噪声误检)。

(5)人脸标注与微笑检测

 for (x, y, w, h) in faces:cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 2), 2)  # 绿色框标记人脸roi_face = frame[y:y+h, x:x+w]  # 提取人脸区域(ROI)cv2.imshow('roi_face', roi_face)  # 单独显示人脸区域# 在ROI区域内检测微笑smile = smiles.detectMultiScale(roi_face, scaleFactor=1.5, minNeighbors=2, minSize=(50,50))for (sx, sy, sw, sh) in smile:a, b = x + sx, y + sy  # 转换坐标到原始图像cv2.rectangle(frame, (a, b), (a+sw, b+sh), (0,0,255), 2)  # 红色框标记微笑cv2.putText(frame, 'smile', (x,y), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,2,155), 2)

关键逻辑:

先检测人脸 → 截取ROI → 在ROI内检测微笑 → 坐标转换回原图。

显示ROI窗口:频繁调用cv2.imshow()可能影响性能。

(6)显示与退出控制

  cv2.imshow('dect', frame)if not ret:breakif cv2.waitKey(1) == 27:  # 按ESC键退出breakcap.release()
cv2.destroyAllWindows()

关键点:

waitKey(1)控制帧率(1ms延迟),按ESC键退出。

释放资源(cap.release())。

效果展示:
请添加图片描述

总结

人脸检测作为计算机视觉的“起点”,既承载着基础研究的智慧沉淀,也驱动着现实场景的创新落地。从Haar级联的快速响应到MTCNN的多任务协同,从OpenCV的轻量级工具到云服务的强大API,技术的迭代始终围绕“精准”与“高效”展开。

然而,技术的进步也伴随着新的思考:如何在提升检测精度的同时保护用户隐私?如何在小算力设备上实现实时检测?这些问题将指引未来研究的方向。无论是开发者还是普通用户,理解人脸检测的原理与应用,都将帮助我们更好地拥抱智能时代,在技术创新与伦理责任之间找到平衡。

期待未来,随着算法的持续优化与跨学科融合,人脸检测将在更多领域开启“看见”与“理解”的新可能。

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

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

相关文章

无线通信模块简介

QuecPython 是运行在无线通信模块上的开发框架。对于首次接触物联网开发的用户而言,无线通信模块可能是一个相对陌生的概念。本文主要针对无线通信和蜂窝网络本身,以及模块的概念、特性和开发方式进行简要的介绍。 无线通信和蜂窝网络 物联网对无线通信…

Unity 中实现首尾无限循环的 ListView

之前已经实现过: Unity 中实现可复用的 ListView-CSDN博客文章浏览阅读5.6k次,点赞2次,收藏27次。源码已放入我的 github,地址:Unity-ListView前言实现一个列表组件,表现方面最核心的部分就是重写布局&…

【C++】 类和对象(上)

1.类的定义 1.1类的定义格式 • class为定义类的关键字,后跟一个类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省 略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或 者成员函数。…

Transformer架构详解:从Attention到ChatGPT

Transformer架构详解:从Attention到ChatGPT 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 Transformer架构详解:从Attention到ChatGPT摘要引言一、Attention机制:Transformer的…

Rock9.x(Linux)安装Redis7

💚提醒:1)注意权限问题 💚 查是否已经安装了gcc gcc 是C语言编译器,Redis是用C语言开发的,我们需要编译它。 gcc --version如果没有安装gcc,那么我们手动安装 安装GCC sudo dnf -y install…

EasyExcel使用导出模版后设置 CellStyle失效问题解决

EasyExcel使用导出模版后在CellWriteHandler的afterCellDispose方法设置 CellStyle失效问题解决方法 问题描述:excel 模版塞入数据后,需要设置单元格的个性化设置时失效,本文以设置数据格式为例(设置列的数据展示时需要加上千分位…

【Day41】

DAY 41 简单CNN 知识回顾 数据增强卷积神经网络定义的写法batch归一化:调整一个批次的分布,常用与图像数据特征图:只有卷积操作输出的才叫特征图调度器:直接修改基础学习率 卷积操作常见流程如下: 1. 输入 → 卷积层 →…

Express教程【002】:Express监听GET和POST请求

文章目录 2、监听post和get请求2.1 监听GET请求2.2 监听POST请求 2、监听post和get请求 创建02-app.js文件。 2.1 监听GET请求 1️⃣通过app.get()方法,可以监听客户端的GET请求,具体的语法格式如下: // 1、导入express const express req…

C# 文件 I/O 操作详解:从基础到高级应用

在软件开发中,文件操作(I/O)是一项基本且重要的功能。无论是读取配置文件、存储用户数据,还是处理日志文件,C# 都提供了丰富的 API 来高效地进行文件读写操作。本文将全面介绍 C# 中的文件 I/O 操作,涵盖基…

Vue-Router简版手写实现

1. 路由库工程设计 首先,我们需要创建几个核心文件来组织我们的路由库: src/router/index.tsRouterView.tsRouterLink.tsuseRouter.tsinjectionsymbols.tshistory.ts 2. injectionSymbols.ts 定义一些注入符号来在应用中共享状态: import…

Electron-vite【实战】MD 编辑器 -- 文件列表(含右键快捷菜单,重命名文件,删除本地文件,打开本地目录等)

最终效果 页面 src/renderer/src/App.vue <div class"dirPanel"><div class"panelTitle">文件列表</div><div class"searchFileBox"><Icon class"searchFileInputIcon" icon"material-symbols-light:…

Remote Sensing投稿记录(投稿邮箱写错、申请大修延期...)风雨波折投稿路

历时近一个半月&#xff0c;我中啦&#xff01; RS是中科院二区&#xff0c;2023-2024影响因子4.2&#xff0c;五年影响因子4.9。 投稿前特意查了下预警&#xff0c;发现近五年都不在预警名单中&#xff0c;甚至最新中科院SCI分区&#xff08;2025年3月&#xff09;在各小类上…

吉林第三届全国龙舟邀请赛(大安站)激情开赛

龙舟竞渡处,瑞气满湖光。5月31日&#xff0c;金蛇献瑞龙舞九州2025年全国龙舟大联动-中国吉林第三届全国龙舟邀请赛(大安站)“嫩江湾杯”白城市全民健身龙舟赛在吉林大安嫩江湾国家5A级旅游区玉龙湖拉开帷幕。 上午9时&#xff0c;伴随着激昂的音乐&#xff0c;活力四射的青春舞…

华为OD机试真题——通过软盘拷贝文件(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》 华为OD机试真题《通过…

一起学数据结构和算法(二)| 数组(线性结构)

数组&#xff08;Array&#xff09; 数组是最基础的数据结构&#xff0c;在内存中连续存储&#xff0c;支持随机访问。适用于需要频繁按索引访问元素的场景。 简介 数组是一种线性结构&#xff0c;将相同类型的元素存储在连续的内存空间中。每个元素通过其索引值&#xff08;数…

ZYNQ sdk lwip配置UDP组播收发数据

🚀 一、颠覆认知:组播 vs 单播 vs 广播 通信方式目标设备网络负载典型应用场景单播1对1O(n)SSH远程登录广播1对全网O(1)ARP地址解析组播1对N组O(1)视频会议/物联网群控创新价值:在智能工厂中,ZYNQ通过组播同时控制100台AGV小车,比传统单播方案降低92%网络流量! 🔧 二、…

机器学习:欠拟合、过拟合、正则化

本文目录&#xff1a; 一、欠拟合二、过拟合三、拟合问题原因及解决办法四、正则化&#xff1a;尽量减少高次幂特征的影响&#xff08;一&#xff09;L1正则化&#xff08;二&#xff09;L2正则化&#xff08;三&#xff09;L1正则化与L2正则化的对比 五、正好拟合代码&#xf…

Linux命令之ausearch命令

一、命令简介 ausearch 是 Linux 审计系统 (auditd) 中的一个实用工具,用于搜索审计日志中的事件。它是审计框架的重要组成部分,可以帮助系统管理员分析系统活动和安全事件。 二、使用示例 1、安装ausearch命令 Ubuntu系统安装ausearch命令,安装后启动服务。 root@testser…

mac电脑安装nvm

方案一、常规安装 下载安装脚本&#xff1a;在终端中执行以下命令来下载并运行 NVM 的安装脚本3&#xff1a; bash curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.39.5/install.sh | bash配置环境变量&#xff1a;安装完成后&#xff0c;需要配置环境变量。如…

Excel 操作 转图片,转pdf等

方式一 spire.xls.free&#xff08;没找设置分辨率的方法&#xff09; macOs开发Java GUI程序提示缺少字体问题解决 Spire.XLS&#xff1a;一款Excel处理神器_spire.xls免费版和收费版的区别-CSDN博客 官方文档 Spire.XLS for Java 中文教程 <dependency><groupI…