一、项目概述
项目采用分层检测逻辑,先识别画面中的人脸区域,再只在人脸范围内检测微笑,有效规避背景干扰,提升识别准确率。程序运行后会调用本地摄像头,绿色框标记人脸,蓝色框标记微笑区域,检测到微笑时画面会显示 smile 提示文字,按下 ESC 键即可退出程序,非常适合入门学习视频流处理、目标检测基础原理。
二、代码实现
1.加载预训练检测模型
代码中加载了两个 OpenCV 官方预训练的 XML 特征模型,分别是正面人脸检测模型和微笑检测模型。这两个模型是官方训练好的,无需我们手动训练,直接调用即可实现目标识别,也是本项目的核心。
2.循环帧处理
使用 while 死循环持续读取摄像头画面,cap.read () 获取每一帧图像,返回读取状态和图像数据。
(1)视频预处理
同时对画面进行水平翻转,解决原生摄像头画面左右颠倒的问题,更符合日常观看习惯。增加状态判断,画面读取失败时直接退出循环,防止程序报错崩溃。
(2)人脸提取
调用 detectMultiScale 方法进行多尺度人脸检测,scaleFactor 控制图像缩放比例,适配远近不同的人脸,minNeighbors 过滤误检区域,minSize 筛选有效人脸尺寸。该方法会返回画面中所有人脸的坐标和宽高数据。
(3)微笑检测与标记
在截取的人脸局部区域中进行微笑检测,相比于人脸检测,微笑检测的参数更严格,有效过滤微小干扰。由于微笑检测的坐标是人脸局部相对坐标,需要叠加人脸全局坐标完成坐标换算,最后用蓝色框标记微笑区域,同时在画面打印 smile 文字,直观提示检测成功。