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

基于OpenCV的人脸微笑检测实现

文章目录

    • 引言
    • 一、技术原理
    • 二、代码实现
      • 2.1 关键代码解析
        • 2.1.1 模型加载
        • 2.1.2 图像翻转
        • 2.1.3 人脸检测 + 微笑检测
      • 2.2 显示效果
    • 三、参数调优建议
    • 四、总结

引言

在计算机视觉领域,人脸检测表情识别一直是热门的研究方向。今天我将分享一个使用Python和OpenCV实现的实时人脸微笑检测系统。这个系统能够通过摄像头捕捉视频流,实时检测人脸并识别微笑表情,非常适合初学者学习计算机视觉的基础应用。

一、技术原理

本实现主要基于OpenCV提供的Haar级联分类器,使用了两个预训练模型:

  1. haarcascade_frontalface_default.xml - 用于人脸检测
  2. haarcascade_smile.xml - 用于微笑检测

Haar级联分类器是一种基于机器学习的物体检测方法,由Paul Viola和Michael Jones在2001年提出。它通过训练大量正负样本,学习物体的特征模式,从而实现快速检测。

二、代码实现

import cv2# 加载预训练模型
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
smile = cv2.CascadeClassifier("haarcascade_smile.xml")
cap = cv2.VideoCapture('smile.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区域(灰度)roi_gray_face = gray[y:y+h,x:x+w]cv2.imshow('Face ROI',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 + sxb = y + sycv2.rectangle(image,(a,b),(a+sw,b+sh),(255,0,0),2)# 显示"smile"文字cv2.putText(image,"smile",(x,y),cv2.FONT_HERSHEY_COMPLEX_SMALL,1,(0,255,255),thickness=2)# 显示结果cv2.imshow("Smile Detection",image)key = cv2.waitKey(25)if key ==27:  # ESC键退出break# 释放资源
cap.release()
cv2.destroyAllWindows()

2.1 关键代码解析

2.1.1 模型加载
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
smile = cv2.CascadeClassifier("haarcascade_smile.xml")

这两行代码加载了OpenCV提供的预训练Haar级联分类器模型。


2.1.2 图像翻转
image = cv2.flip(image, 1)
  1. cv2.flip()函数

    • 作用:翻转输入图像(水平、垂直或同时翻转)。
    • 参数:
      • 第1个参数 image:输入的图像(NumPy数组)。
      • 第2个参数 1:翻转模式的标志。
        • 0:垂直翻转(沿x轴翻转)。
        • 1:水平翻转(沿y轴翻转,即镜像效果)。
        • -1:同时水平和垂直翻转。
  2. flipCode=1 的效果
    假设原图为:

			原图:    [A B C]   → 翻转后: [C B A][D E F]             [F E D]
  • 每一行的元素顺序被反转,但行的顺序不变。

2.1.3 人脸检测 + 微笑检测
for (x,y,w,h) in faces:cv2.rectangle(image,(x,y),(x + w,y + h),(0,255,0),2)# 提取人脸所在区域,多通道形式# roiColorFace = image(y:y+h,x:x+w)# 提取人脸所在区域,单通道形式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 + sxb = y + sycv2.rectangle(image,(a,b),(a+sw,b+sh),(255,0,0),2)# 显示文字“smile” 表示微笑了cv2.putText(image,"smile",(x,y),cv2.FONT_HERSHEY_COMPLEX_SMALL,1,(0,255,255),thickness=2)

这段代码是一个 人脸检测 + 微笑检测 的程序,主要使用了 OpenCV 的 Haar 级联分类器(detectMultiScale)来检测人脸和微笑。以下是详细解析:


代码功能概述

  1. 检测人脸(在 faces 中存储的人脸矩形框)。
  2. 提取人脸区域(灰度图 roi_gray_face)。
  3. 在人脸区域内检测微笑smiles)。
  4. 绘制人脸框和微笑框,并标注文字“smile”。

代码逐行解析

1. 遍历检测到的人脸

for (x, y, w, h) in faces:
  • faces 是一个包含人脸矩形框的列表,每个框由 (x, y, w, h) 表示:
    • (x, y):人脸左上角坐标。
    • (w, h):人脸的宽度和高度。

2. 绘制人脸矩形框

cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
  • 在原始图像 image 上绘制绿色矩形框(RGB (0,255,0)),线宽为 2

3. 提取人脸区域(灰度图)

roi_gray_face = gray[y:y+h, x:x+w]
cv2.imshow('lian', roi_gray_face)
  • gray 是灰度图像(单通道)。
  • roi_gray_face 是从 gray 中截取的人脸区域。
  • cv2.imshow('lian', roi_gray_face) 显示人脸区域的灰度图(窗口名 'lian')。

4. 在人脸区域内检测微笑

smiles = smile.detectMultiScale(roi_gray_face,scaleFactor=1.5,minNeighbors=2,minSize=(50, 50)
)
  • smile 是一个训练好的 Haar 级联分类器(用于微笑检测)。
  • 参数说明
    • scaleFactor=1.5:每次图像缩放的比例(越大检测越快,但可能漏检)。
    • minNeighbors=2:候选框至少需要多少个邻近检测才被确认(越小误检越多)。
    • minSize=(50, 50):微笑区域的最小尺寸(小于该尺寸的忽略)。

5. 遍历检测到的微笑区域

for (sx, sy, sw, sh) in smiles:
  • smiles 包含微笑矩形框 (sx, sy, sw, sh),坐标是相对于 roi_gray_face(人脸区域)的。

6. 绘制微笑框(蓝色)

a = x + sx  # 转换到原始图像的坐标
b = y + sy
cv2.rectangle(image, (a, b), (a + sw, b + sh), (255, 0, 0), 2)
  • (a, b) 是微笑框在原始图像 image 中的左上角坐标。
  • 绘制蓝色矩形框(RGB (255,0,0)),线宽 2

7. 标注文字“smile”

cv2.putText(image, "smile", (x, y), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0, 255, 255), 2)
  • 在人脸框左上角 (x, y) 处显示黄色文字“smile”:
    • 字体:cv2.FONT_HERSHEY_COMPLEX_SMALL
    • 字号:1
    • 颜色:(0, 255, 255)(黄色)。
    • 线宽:2

代码执行流程

  1. 输入图像 → 检测人脸 → 绘制绿色人脸框。
  2. 提取人脸区域 → 检测微笑 → 绘制蓝色微笑框。
  3. 标注“smile”文字 → 显示结果。

注意事项

  1. 依赖 Haar 级联分类器
    • facessmiles 是由 cv2.CascadeClassifier 检测得到的。
    • 通常需要加载预训练模型:
      face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
      smile_cascade = cv2.CascadeClassifier('haarcascade_smile.xml')
      
  2. 参数调优
    • scaleFactorminNeighbors 影响检测精度和速度,需根据实际场景调整。
  3. 坐标转换
    • 微笑检测是在人脸区域 (roi_gray_face) 内进行的,绘制时需要转换回原始图像坐标。

2.2 显示效果

    # 显示结果cv2.imshow("dect",image)key = cv2.waitKey(25)if key ==27:break
cap.release()
cv2.destroyAllWindows()
  • 显示效果如下,我们插入一段视频,在视频中对人物进行微笑检测,并画出检测框:

在这里插入图片描述

三、参数调优建议

  1. 人脸检测参数

    • minNeighbors值越大,检测越严格,但可能漏检
    • scaleFactor通常在1.01-1.5之间
  2. 微笑检测参数

    • 由于微笑区域相对较小,minSize不宜设置过大
    • minNeighbors可以适当调小以避免漏检

四、总结

本文介绍了一个基于OpenCV Haar级联分类器的实时微笑检测系统。虽然Haar级联分类器在复杂场景下可能表现不佳,但它的计算效率高,非常适合初学者学习和快速原型开发。通过调整参数和优化流程,可以在实际应用中获得不错的效果。

相关文章:

基于OpenCV的人脸微笑检测实现

文章目录 引言一、技术原理二、代码实现2.1 关键代码解析2.1.1 模型加载2.1.2 图像翻转2.1.3 人脸检测 微笑检测 2.2 显示效果 三、参数调优建议四、总结 引言 在计算机视觉领域,人脸检测和表情识别一直是热门的研究方向。今天我将分享一个使用Python和OpenCV实现…...

使用PEFT库将原始模型与LoRA权重合并

使用PEFT库将原始模型与LoRA权重合并 步骤如下: 基础模型加载:需保持与LoRA训练时相同的模型配置merge_and_unload():该方法会执行权重合并并移除LoRA层保存格式:合并后的模型保存为标准HuggingFace格式,可直接用于推…...

2025-5-15Vue3快速上手

1、setup和选项式API之间的关系 (1)vue2中的data,methods可以与vue3的setup共存 (2)vue2中的data可以用this读取setup中的数据,但是反过来不行,因为setup中的this是undefined (3)不建议vue2和vue3的语法混用…...

【金仓数据库征文】从生产车间到数据中枢:金仓数据库助力MES系统国产化升级之路

目录 前言一、金仓数据库:国产数据库的中坚力量二、制造业MES系统:数据驱动的生产智能MES系统的核心价值MES系统关键模块与数据库的关系1. BOM管理2. 生产工单与订单管理3. 生产排产与资源调度4. 生产报工与实时数据采集 5. 采购与销售管理 三、从MySQL到…...

HTML17:表单初级验证

表单初级验证 常用方式 placeholder 提示信息 <p>名字:<input type"text" name"username" maxlength"8" size"30" placeholder"请输入用户名"></p>required 非空判断 <p>名字:<input type"…...

从卡顿到丝滑:JavaScript性能优化实战秘籍

引言 在当今的 Web 开发领域&#xff0c;JavaScript 作为前端开发的核心语言&#xff0c;其性能表现对网页的加载速度、交互响应以及用户体验有着举足轻重的影响。随着 Web 应用的复杂度不断攀升&#xff0c;功能日益丰富&#xff0c;用户对于网页性能的期望也越来越高。从电商…...

How Sam‘s Club nudge customers into buying more

Here’s how Sam’s Club (or similar warehouse memberships) nudge customers into buying more: It’s a classic psychological strategy rooted in sunk cost fallacy and loss aversion. 1. Prepaid Membership Creates a “Sunk Cost” Once you’ve paid the annual …...

ORB特征点检测算法

角点是图像中灰度变化在两个方向上都比较剧烈的点。与边缘&#xff08;只有一个方向变化剧烈&#xff09;或平坦区域&#xff08;灰度变化很小&#xff09;不同&#xff0c;角点具有方向性和稳定性。 tips:像素梯度计算 ORB算法流程简述 1.关键点检测&#xff08;使用FAST…...

快速通关单链表秘籍

1.单链表概念与结构 1.1 概念 链表是一种逻辑结构连续&#xff0c;物理结构不连续的存储结构&#xff0c;数据结构的逻辑顺序是通过链表中的指针链接次序实现。 光看定义有点不好理解&#xff0c;我们举个简单例子&#xff01; 我们都看过火车吧&#xff0c;我们看到的火车…...

springboot+vue实现在线书店(图书商城)系统

今天教大家如何设计一个图书商城 , 基于目前主流的技术&#xff1a;前端vue&#xff0c;后端springboot。 同时还带来的项目的部署教程。 视频演示 在线书城 图片演示 一. 系统概述 商城是一款比较庞大的系统&#xff0c;需要有商品中心&#xff0c;库存中心&#xff0c;订单…...

C++二项式定理:原理、实现与应用

背景 鉴于复习&#xff0c;问了问清言二项式定理的应用…只好多找些资源…肝要死了… 一、引言 二项式定理是数学中一个基本定理&#xff0c;主要用于展开二项式的幂次。在C编程中&#xff0c;理解并实现二项式定理及其拓展具有重要意义&#xff0c;可以解决组合数学、概率论…...

使用GmSSL v3.1.1实现SM2证书认证

1、首先使用gmssl命令生成根证书、客户端公私钥&#xff0c;然后使用根证书签发客户端证书&#xff1b; 2、然后编写代码完成认证功能&#xff0c;使用根证书验证客户端证书是否由自己签发&#xff0c;然后使用客户端证书验证客户端私钥对随机数的签名是否正确。 第一部分生成根…...

远程实时控制安卓模拟器技术scrcpy

先运行模拟器 ~/Library/Android/sdk/emulator/emulator -avd Medium_Phone_API_25 再检查adb device /Users/xmkjsoft/Downloads/scrcpy-macos-x86_64-v3.2/adb devices 再开始实时获取模拟器画面 /Users/xmkjsoft/Downloads/scrcpy-macos-x86_64-v3.2/scrcpy --video-cod…...

Spring AI(6)——向量存储

向量数据库是一种特殊类型的数据库&#xff0c;在 AI 应用中发挥着至关重要的作用。 在向量数据库中&#xff0c;查询与传统关系型数据库不同。它们执行的是相似性搜索&#xff0c;而非精确匹配。当给定一个向量作为查询时&#xff0c;向量数据库会返回与该查询向量“相似”的…...

Spring Data Elasticsearch 中 ElasticsearchOperations 构建查询条件的详解

Spring Data Elasticsearch 中 ElasticsearchOperations 构建查询条件的详解 前言一、引入依赖二、配置 Elasticsearch三、创建模型类&#xff08;Entity&#xff09;四、使用 ElasticsearchOperations 进行 CRUD 操作1. 保存数据&#xff08;Create&#xff09;2. 获取数据&am…...

react-router基本写法

1. 创建项目并安装所有依赖 npx create-react-app react-router-pro npm i 2. 安装所有的 react router 包 npm i react-router-dom 3. 启动项目 npm run start router/index.js // 创建路由实例 绑定path elementimport Layout from "/pages/Layout"; import…...

【Matlab】最新版2025a发布,深色模式、Copilot编程助手上线!

文章目录 一、软件安装1.1 系统配置要求1.2 安装 二、新版功能探索2.1 界面图标和深色主题2.2 MATLAB Copilot AI助手2.3 绘图区升级2.4 simulink2.5 更多 延迟一个月&#xff0c;终于发布了&#x1f92d;。 一、软件安装 1.1 系统配置要求 现在的电脑都没问题&#xff0c;老…...

智能语音助手的未来:从交互到融合

摘要 随着人工智能技术的不断进步&#xff0c;智能语音助手已经成为我们生活中不可或缺的一部分。从简单的语音指令到复杂的多模态交互&#xff0c;语音助手正在经历一场深刻的变革。本文将探讨智能语音助手的发展历程、当前的技术瓶颈以及未来的发展方向&#xff0c;特别是其在…...

uniapp,小程序中实现文本“展开/收起“功能的最佳实践

文章目录 示例需求分析实现思路代码实现1. HTML结构2. 数据管理3. 展开/收起逻辑4. CSS样式 优化技巧1. 性能优化2. 防止事件冒泡3. 列表更新处理 实际效果总结 在移动端应用开发中&#xff0c;文本内容的"展开/收起"功能是提升用户体验的常见设计。当列表项中包含大…...

思维链框架:LLMChain,OpenAI,PromptTemplate

什么是思维链,怎么实现 目录 什么是思维链,怎么实现思维链(Chain of Thought)在代码中的实现方式1. 手动构建思维链提示2. 少样本思维链提示3. 自动思维链生成4. 思维链与工具使用结合5. 使用现有思维链框架:LLMChain,OpenAI,PromptTemplate思维链实现的关键要点思维链(C…...

HOT100 (哈希双指针)

哈希 1.两数之和(unordered_map) 给定一个整数数组 nums 和一个整数目标值 target,返回满足条件的数组下标 思路:用umap,一边遍历,一边装; class Solution {public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int,int> u…...

使用 QGIS 插件 OpenTopography DEM Downloader 下载高程数据(申请key教程)

使用 QGIS 插件 OpenTopography DEM Downloader 下载高程数据 目录 使用 QGIS 插件 OpenTopography DEM Downloader 下载高程数据&#x1f4cc; 简介&#x1f6e0; 插件安装方法&#x1f30d; 下载 DEM 数据步骤&#x1f511; 注册 OpenTopography 账号&#xff08;如使用 Cope…...

计算机组成与体系结构:替换策略(MRU LRU PLRU LFU)

目录 &#x1f3b2; MRU&#xff08;最近最常使用&#xff09; &#x1fa9c; 操作流程&#xff1a; &#x1f3b2; LRU&#xff08;最近最少使用&#xff09; &#x1fa9c; 操作流程&#xff1a; 示例 &#x1f50d; Age Bits&#xff08;年龄位&#xff09; 核心思想…...

websocket入门详解

入门websocket的基础应该掌握一下问题&#xff1a; 1、什么是握手&#xff1f; 2、什么是websocket&#xff1f; 3、websocket和http的区别&#xff0c;应用场景 4、html前端简单代码演示 5、springboot整合websocket使用 6、使用vueelementui打造简单聊天室 7、使用web…...

《数字藏品社交化破局:React Native与Flutter的创新实践指南》

NFT&#xff0c;这种非同质化代币&#xff0c;赋予了数字资产独一无二的身份标识&#xff0c;从数字艺术作品到限量版虚拟物品&#xff0c;每一件NFT数字藏品都承载着独特的价值与意义。当React Native和Flutter这两大跨平台开发框架遇上NFT数字藏品&#xff0c;一场技术与创意…...

(6)python开发经验

文章目录 1 QListWidget样式显示异常2 模块编码错误3 qtcreator开发pyqt编码错误 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt开发 &#x1f448;&#x1f449;python开发 &#x1f448; 1 QListWidget样式显示异常 main.py import sys from PySide6.QtWi…...

HPC软件使用之ANSYS Fluent

目录 一、软件介绍 二、脚本编写 2.1 jou文件 2.2 slurm脚本文件 三、作业提交及查看 四、案例演示 4.1 网格模型 4.2 jou脚本 4.3 slurm脚本 4.4 计算 4.5 结果查看 从本文开始&#xff0c;我们将介绍如何在超级计算机上使用科学计算、工程仿真计算软件开展计算&am…...

YOLO11解决方案之距离计算探索

概述 Ultralytics提供了一系列的解决方案&#xff0c;利用YOLO11解决现实世界的问题&#xff0c;包括物体计数、模糊处理、热力图、安防系统、速度估计、物体追踪等多个方面的应用。 测量两个物体之间的间距被称为特定空间内的距离计算&#xff0c;YOLO11使用两个边界框的中心…...

论文学习_Precise and Accurate Patch Presence Test for Binaries

摘要&#xff1a;打补丁是应对软件漏洞的主要手段&#xff0c;及时将补丁应用到所有受影响的软件上至关重要&#xff0c;然而这一点在实际中常常难以做到&#xff0c;研究背景。因此&#xff0c;准确检测安全补丁是否已被集成进软件发行版本的能力&#xff0c;对于防御者和攻击…...

Ascend的aclgraph(九)AclConcreteGraph:e2e执行aclgraph

1回顾 前面的几章内容探讨了aclgraph运行过程中的涉及到的关键模块和技术。本章节将前面涉及到的模块串联起来&#xff0c;对aclgraph形成一个端到端的了解。 先给出端到端运行的代码&#xff0c;如下&#xff1a; import torch import torch_npu import torchair import log…...