OpenCV 微笑检测

一、引言

在当今数字化时代,计算机视觉技术取得了飞速的发展。微笑检测作为其中一个有趣且实用的应用场景,被广泛应用于娱乐、安防、人机交互等多个领域。OpenCV 作为一个强大的计算机视觉库,为我们实现微笑检测提供了丰富的工具和便捷的接口。本文将详细介绍如何使用 OpenCV 进行微笑检测,包括原理、实现步骤以及代码示例。

二、微笑检测的原理

微笑检测主要基于人脸检测和表情特征分析。其基本流程如下:

1.人脸检测:首先需要在图像或视频帧中定位出人脸的位置。常用的方法是基于 Haar 级联分类器,它通过一系列的弱分类器组合成强分类器,能够快速有效地检测出人脸。

2.特征提取:在检测到人脸后,需要进一步提取人脸的特征,例如眼睛、嘴巴等关键部位的位置和形状。这些特征可以帮助我们判断人脸是否处于微笑状态。

3.表情分类:根据提取的特征,使用预先训练好的分类器(如 SVM、神经网络等)对人脸表情进行分类,判断是否为微笑表情。

三、代码实现

所用到的分类器文件的数据:通过网盘分享的文件:data

链接: https://pan.baidu.com/s/1Dd2LYzSRwcbLJT-wXGm0pA 提取码: 5iv1

1. 导入库和加载分类器

python 复制代码
import cv2
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
smile = cv2.CascadeClassifier("haarcascade_smile.xml")

import cv2:导入 OpenCV 库,它是一个强大的计算机视觉库,可用于图像处理、视频处理等任务。

cv2.CascadeClassifier('haarcascade_frontalface_default.xml'):加载预训练的 Haar 级联分类器,用于检测人脸。haarcascade_frontalface_default.xml 是 OpenCV 提供的用于正面人脸检测的分类器文件。

cv2.CascadeClassifier("haarcascade_smile.xml"):加载预训练的 Haar 级联分类器,用于检测微笑。haarcascade_smile.xml 是用于微笑检测的分类器文件。

2. 打开视频文件

python 复制代码
cap = cv2.VideoCapture('xiao.mp4')

3. 视频帧循环处理

python 复制代码
while True:
    ret, image = cap.read()  # 读一帧
    image = cv2.flip(image, 1)
    if ret is None:
        break

cap.read():从视频文件中读取一帧图像。ret 是一个布尔值,表示是否成功读取到帧;image 是读取到的图像帧。

cv2.flip(image, 1):对图像进行水平翻转。参数 1 表示水平翻转,0 表示垂直翻转,-1 表示水平和垂直同时翻转。

if ret is None: break:如果无法读取到帧(例如视频结束),则退出循环。

4. 图像预处理

python 复制代码
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

5. 人脸检测

python 复制代码
faces = faceCascade.detectMultiScale(gray,  # 人脸检测
                                     scaleFactor=1.1,
                                     minNeighbors = 15,
                                     minSize = (5,5))

faceCascade.detectMultiScale:使用人脸分类器在灰度图像上进行人脸检测。

gray:输入的灰度图像。

scaleFactor=1.1:图像缩放比例,用于在不同尺度下检测人脸。每次检测时,图像会按照该比例缩小。

minNeighbors = 15:每个候选矩形应该保留的邻居数。该值越大,检测结果越准确,但可能会漏掉一些人脸。

minSize = (5,5):检测的最小人脸尺寸。小于该尺寸的人脸将不会被检测到。

6. 绘制人脸矩形框

python 复制代码
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x + w, y + h),  (0, 255, 0),  2)
    roi_gray_face = gray[y:y+h, x:x+w]
    cv2.imshow('lian', roi_gray_face)

cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2):在原始图像上绘制人脸矩形框。(x, y) 是矩形框的左上角坐标,(x + w, y + h) 是右下角坐标,(0, 255, 0) 是矩形框的颜色(绿色),2 是矩形框的线宽。

roi_gray_face = gray[y:y+h, x:x+w]:提取人脸区域的灰度图像,用于后续的微笑检测。

cv2.imshow('lian', roi_gray_face):显示提取的人脸灰度图像。

7. 微笑检测

python 复制代码
smiles = smile.detectMultiScale(roi_gray_face,
                                scaleFactor = 1.5,
                                minNeighbors = 2,
                                minSize = (50, 50))

smile.detectMultiScale:在人脸区域的灰度图像上进行微笑检测。

roi_gray_face:输入的人脸区域灰度图像。

scaleFactor = 1.5:图像缩放比例。

minNeighbors = 2:每个候选矩形应该保留的邻居数。

minSize = (50, 50):检测的最小微笑区域尺寸。

8. 绘制微笑矩形框和文字

python 复制代码
for (sx, sy, sw, sh) in smiles:
    a = x + sx
    b = y + sy
    cv2.rectangle(image, (a, b), (a + sw, b + sh), (0, 255, 0), 2)
    cv2.putText(image, "smile", (x, y), cv2.FONT_HERSHEY_COMPLEX_SMALL,  1,
                (0, 255, 255), thickness=2)

cv2.rectangle(image, (a, b), (a + sw, b + sh), (0, 255, 0), 2):在原始图像上绘制微笑区域的矩形框。 • cv2.putText(image, "smile", (x, y), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0, 255, 255), thickness=2):在人脸矩形框的左上角添加文字 "smile",表示检测到微笑。

9. 显示结果和退出处理

python 复制代码
cv2.imshow("dect", image)
key = cv2.waitKey(25)
if key == 27:
    break

cv2.imshow("dect", image):显示处理后的图像。

cv2.waitKey(25):等待 25 毫秒,以便用户有时间查看图像。返回用户按下的按键的 ASCII 码值。

if key == 27: break:如果用户按下 Esc 键(ASCII 码值为 27),则退出循环。

10. 释放资源

python 复制代码
cap.release()
cv2.destroyAllWindows()

cap.release():释放视频捕获对象,关闭视频文件。

cv2.destroyAllWindows():关闭所有 OpenCV 窗口。

完整代码实现:

python 复制代码
import cv2
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
smile =cv2.CascadeClassifier("haarcascade_smile.xml")
cap = cv2.VideoCapture('xiao.mp4')
while True:
    ret,image=cap.read() #读一
    image =cv2.flip(image, 1)
    if ret is None:
        break
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    faces = faceCascade.detectMultiScale(gray,  # 人始检测
                                         scaleFactor=1.1,
                                         minNeighbors = 15,
                                         minSize = (5,5))
    for (x, y, w, h) in faces:
        cv2.rectangle(image, (x, y), (x + w, y + h),  (0, 255, 0),  2)
        roi_gray_face=gray[y:y+h,x:x+w]
        cv2.imshow('lian',roi_gray_face)
        smiles = smile.detectMultiScale(roi_gray_face,
                                        scaleFactor = 1.5,
                                        minNeighbors = 2,
                                        minSize = (50, 50))
        for (sx, sy, sw, sh) in smiles:
            a = x+ sx
            b = y+ sy
            cv2.rectangle(image,(a,b),
                          (a+sw,b+sh),(0,255,0),2)
            cv2.putText(image, "smile",(x,y), cv2.FONT_HERSHEY_COMPLEX_SMALL,  1,
                        (0,255,255), thickness=2)
    cv2.imshow("dect",image)
    key=cv2.waitKey(25)
    if key == 27:
        break
cap.release()
cv2.destroyAllWindows()

结果展示:

四、总结

本文介绍了如何使用 OpenCV 实现微笑检测。通过加载预训练的 Haar 级联分类器,我们可以快速有效地在图像和视频中检测人脸和微笑。微笑检测不仅是一个有趣的应用,还具有广泛的实际用途。希望本文能够帮助你入门 OpenCV 微笑检测,并激发你对计算机视觉的兴趣。

相关推荐
奋斗者1号2 分钟前
神经网络之训练的艺术:反向传播与常见问题解决之道
人工智能·深度学习·神经网络
白熊1889 分钟前
【大模型】使用 LLaMA-Factory 进行大模型微调:从入门到精通
人工智能·大模型·llama
Listennnn28 分钟前
PyTorch 中如何针对 GPU 和 TPU 使用不同的处理方式
人工智能·pytorch·python
新加坡内哥谈技术31 分钟前
OpenAI 结构改革:迈向民主化 AI 的新篇章
人工智能
小柔说科技1 小时前
传统销售VS智能销售:AI如何重构商业变现逻辑
人工智能·重构·ai销售·销售方法
通信大模型1 小时前
基于注意力机制的无人机轨迹优化方法:面向无线能量传输的物联网系统
人工智能·深度学习·物联网·无人机·信息与通信
超级架构师1 小时前
【机器学习与数据科学全领域速查表】
人工智能·机器学习
向哆哆1 小时前
UniRepLknet助力YOLOv8:高效特征提取与目标检测性能优化
人工智能·yolo·目标检测·yolov8
枫夜求索阁1 小时前
大模型文件类型揭秘:从基础到面试挑战
人工智能·面试·职场和发展·大模型
engchina2 小时前
测试一下多模态提取图片中文字的能力
人工智能·多模态·提取图片文字