一、介绍
本次实验处理流程:
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.视频流处理与显示。