OpenCV中的微笑检测

一、介绍

本次实验处理流程:

1.加载OpenCV预训练的人脸检测级联分类器和微笑检测级联分类器。

2.逐帧读取视频,对每帧进行灰度转换。

3.先检测人脸(用绿色矩形框出),然后截取人脸区域(ROI)。

4.在人脸ROI内检测微笑(用蓝色矩形框出),并在画面左上角显示"smile"文字。

5.实时显示处理后的画面,按ESC键退出。

二、核心代码

2.1导入库与加载级联分类器

cv2.CascadeClassifier用于加载Haar特征级联分类器(基于Viola-Jones算法)。

cv2.data.haarcascades指向OpenCV自带的预训练分类器存放路径。

haarcascade_frontalface_default.xml:检测正脸。

haarcascade_smile.xml:检测微笑(在脸部区域内的嘴部特征)。

这两个文件是训练好的XML模型,用于快速目标检测。

2.2主循环:逐帧处理

cap.read()返回两个值:ret(布尔值,表示是否成功读取帧)和image(当前帧图像,BGR格式)。

cv2.flip(image,1):沿Y轴水平翻转图像,效果类似镜像。这样做可能是为了视频中人物动作方向与观众视角一致,但取决于视频内容。如果视频本身不是镜像拍摄,翻转后会导致左右颠倒,可能影响检测效果

2.3灰度转换与多尺度人脸检测

cvtColor将BGR转为灰度图,因为Haar级联检测器输入要求灰度图.

detectMultiScale参数:

gray:输入灰度图像。

scaleFactor=1.1:图像金字塔的缩放比例,每次缩小为原来的1/1.1,值越大检测速度越快但可能漏检。

minNeighbors=15:每个候选矩形至少需要多少个邻近检测框才被保留(值越大,误报越少,但可能漏检)。

minSize=(5,5):检测目标的最小尺寸(像素),太小会忽略。

返回值为矩形列表,每个矩形代表人脸位置。

2.4遍历每个人脸

在原图上绘制绿色矩形框出人脸。(0,255,0)表示绿色,线宽2。

从灰度图中截取人脸区域roi_gray_face。

cv2.imshow('lian',roi_gray_face)额外显示一个人脸区域的独立窗口,可用于调试,但这里每一帧都会更新,若不需要可注释掉。

2.5在人脸区域内检测微笑

使用smile分类器在roi_gray_face中检测微笑,参数:

scaleFactors=1.5,表示缩放步长大,检测更快,但可能漏掉小尺寸的微笑。

minNeighbors,代表"最小邻居数",它是用来筛选候选框的一个阈值参数。

minSize=(50,50):微笑区域最小50*50像素,如果人脸很小,可能检测不到。

对于检测到的每个微笑矩形(sx,sy,sw,sh),其坐标是相对于人脸ROI的,所有要转换到全局坐标:a=X+sx,b=y+sy。

在原图上用蓝色矩形(255,0,0)绘制微笑区域。

在人脸左上角(x,y)位置用黄色文字(0,255,255)显示"smile"字样。

三、总结

本次学习的是一个典型的OpenCV级联分类器应用示例,能够实现基础的实时微笑检测。它展示了:1.级联分类器的加载与使用。2.多尺度目标检测的参数调优。3.ROI截取与坐标交换。4.视频流处理与显示。

相关推荐
Blockchina1 小时前
用 Codex 搭建一条可复用的 AI 视频生产线
人工智能
reasonsummer1 小时前
【办公类-146-07】20260906《总园大班6个班级四大教育》(优化版:标题excle+复制AI文字+Python占位符录入)
人工智能·python·c#
陈童学哦1 小时前
FDE岗位年薪百万?拆解中小企业AI落地四步框架
人工智能
richard_first1 小时前
50.5% 美国人认为 AI 恋爱可能算出轨:AI 正在从“工具“变成“关系主体“
人工智能·microsoft
华清远见成都中心1 小时前
神经网络中的损失函数是什么
人工智能·深度学习·神经网络
小赵AI手记1 小时前
技术拆解(二十)具身智能:SO-ARM101抓取小狗的胡萝卜,我看见了AI如何降低跨行门槛
人工智能·机器人
AngusKit1 小时前
AngusTester 是什么:AI 原生软件测试
自动化测试·人工智能·测试工具·性能测试·web测试·api测试·llm测试
知了一笑1 小时前
AI知识库,是捷径吗?
人工智能·ai·知识库