当前位置: 首页 > news >正文

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.xdnf.cn/news/677143.html

相关文章:

  • 第二章:软盘里的90年代
  • 力扣四道题,力扣LCR 016无重复字符的最长子串力扣452.用最小数量的箭引爆气球LCR026.重排链表力扣.1765地图中的最高点
  • 猿大师办公助手WebOffice用二进制数据流在Web前端打开Office文档
  • 如何使用 Redis 实现排行榜功能
  • 中车靶场,网络安全暑期实训营
  • [特殊字符]使用 Hyperlane 实现 WebSocket广播
  • MySql(四)
  • python-自定义导包问题ModuleNotFoundError: No module named
  • Linux 文件管理相关知识与命令
  • Linux升级内核回退到旧内核启动
  • Linux 进阶命令篇
  • 广东省省考备考(第二十二天5.27)—言语(第九节课)
  • Python正则表达式:30秒精通文本处理
  • 【判断含有相同数字rfind】2022-1-28
  • 高频面试--redis
  • [yolov11改进系列]基于yolov11引入分布移位卷积DSConv的python源码+训练源码
  • AI智能体策略FunctionCalling和ReAct有什么区别?
  • 多卡训练的开源大模型,开箱即用
  • Jenkins实践(8):服务器A通过SSH调用服务器B执行Python自动化脚本
  • WSL连接网络
  • 新太空原子钟任务为全球标准化测高系统铺平道路
  • 编译原理——语法制导的语义计算
  • 欢乐熊大话蓝牙知识11:如何打造一个低功耗蓝牙温湿度传感器?
  • getline()跳过输入
  • 01背包问题
  • 【Elasticsearch】_update api用于更新单文档,更新多个文档使用_update_by_query
  • 软件更新 | TSMaster 202504 版本已上线!三大功能让车载测试更智能
  • 基于Python技术的面部考勤微信小程序的设计与实现
  • 2025年上半年第1批信息系统项目管理师论文真题解析与范文
  • 【力扣】面试题 01.04. 回文排列