基于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级联分类器在复杂场景下可能表现不佳,但它的计算效率高,非常适合初学者学习和快速原型开发。通过调整参数和优化流程,可以在实际应用中获得不错的效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/906548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 大视界 -- 基于 Java 的大数据分布式存储在视频会议系统海量视频数据存储与回放中的应用(263)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

Kotlin 极简小抄 P9 - 数组(数组的创建、数组元素的访问与修改、数组遍历、数组操作、多维数组、数组与可变参数)

Kotlin 概述 Kotlin 由 JetBrains 开发,是一种在 JVM(Java 虚拟机)上运行的静态类型编程语言 Kotlin 旨在提高开发者的编码效率和安全性,同时保持与 Java 的高度互操作性 Kotlin 是 Android 应用开发的首选语言,也可…

gitlab+portainer 实现Ruoyi Vue前端CI/CD

1. 场景 最近整了一个Ruoyi Vue 项目,需要实现CICD,经过一番坎坷,最终达成,现将技术要点和踩坑呈现。 具体操作流程和后端大同小异,后端操作参考连接如下: https://blog.csdn.net/leinminna/article/detai…

RNN神经网络

RNN神经网络 1-核心知识 1-解释RNN神经网络2-RNN和传统的神经网络有什么区别?3-RNN和LSTM有什么区别?4-transformer的归一化有哪几种实现方式 2-知识问答 1-解释RNN神经网络 Why:与我何干? 在我们的生活中,很多事情…

javaweb-html

1.交互流程: 浏览器向服务器发送http请求,服务器对浏览器进行回应,并发送字符串,浏览器能对这些字符串(html代码)进行解释; 三大web语言:(1)html&#xff1a…

从混乱到高效:我们是如何重构 iOS 上架流程的(含 Appuploader实践)

从混乱到高效:我们是如何重构 iOS 上架流程的 在开发团队中,有一类看不见却至关重要的问题:环境依赖。 特别是 iOS App 的发布流程,往往牢牢绑死在一台特定的 Mac 上。每次需要发版本,都要找到“那台 Mac”&#xff…

FPGA:CLB资源以及Verilog编码面积优化技巧

本文将先介绍Kintex-7系列器件的CLB(可配置逻辑块)资源,然后分享在Verilog编码时节省CLB资源的技巧。以下内容基于Kintex-7系列的架构特点,并结合实际设计经验进行阐述。 一、Kintex-7系列器件的CLB资源介绍 Kintex-7系列是Xilin…

在linux里上传本地项目到github中

首先先安装git,安装完git后,输入如下操作指令: 输入自己的用户名和邮箱(为注册GITHUB账号时的用户名和邮箱): git config --global user.name "111"git config --global user.email "121…

鸿蒙Flutter实战:25-混合开发详解-5-跳转Flutter页面

概述 在上一章中,我们介绍了如何初始化 Flutter 引擎,本文重点介绍如何添加并跳转至 Flutter 页面。 跳转原理 跳转原理如下: 本质上是从一个原生页面A 跳转至另一个原生页面 B,不过区别在于,页面 B是一个页面容器…

c语言 写一个五子棋

c语言 IsWin判赢 display 画 10 x 10 的棋盘 判断落子的坐标是否已有棋子 判断落子坐标范围是否超出范围 // 五子棋 #include <stdio.h> #include <stdlib.h>// 画棋盘 10 x 10的棋盘&#xff0c;len为行数 void display(char map[][10], int len) {system(&q…

格雷希尔快速封堵接头,解决新能源汽车的气密性检测和三电系统的综合测试

我国的新能源汽车已经遥遥领先&#xff0c;让其他国家望尘莫及。格雷希尔GripSeal&#xff0c;为新能源汽车制造业提供快速可靠的密封连接器&#xff0c;让测试速度加倍。以好抓取、易密封为设计理念&#xff0c;实现一秒连接&#xff0c;瞬时密封的高效性能。通过持续的产品设…

人工智能全景解析:从技术原理到未来趋势的深度探索

人工智能(AI)作为21世纪最具变革性的技术之一&#xff0c;正以前所未有的速度重塑着人类社会。从智能手机中的语音助手到工厂里的智能机器人&#xff0c;从医疗诊断系统到金融风控模型&#xff0c;AI技术已渗透到我们生活和工作的方方面面。本文将全面解析人工智能的发展历程、…

[密码学实战]使用C语言实现TCP服务端(二十九)

[密码学实战]使用C语言实现TCP服务端(二十九) 引言 TCP(传输控制协议)是互联网通信中最核心的协议之一,它提供可靠的、面向连接的数据传输服务。通过C语言的标准Socket API,开发者可以灵活地实现TCP客户端和服务端程序。本文将详细讲解TCP通信的原理,并提供完整的代码…

IPv4 地址嵌入 IPv6 的前缀转换方式详解

1. 概述 在 IPv4 和 IPv6 网络共存的过渡期&#xff0c;NAT64&#xff08;Network Address Translation 64&#xff09;是一种关键技术&#xff0c;用于实现 IPv6-only 网络与 IPv4-only 网络的互操作。NAT64 前缀转换通过将 IPv4 地址嵌入到 IPv6 地址中&#xff0c;允许 IPv…

动态神经网络(Dynamic NN)在边缘设备的算力分配策略:MoE架构实战分析

一、边缘计算场景的算力困境 在NVIDIA Jetson Orin NX&#xff08;64TOPS INT8&#xff09;平台上部署视频分析任务时&#xff0c;开发者面临三重挑战&#xff1a; 动态负载波动 视频流分辨率从480p到4K实时变化&#xff0c;帧率波动范围20-60FPS 能效约束 设备功耗需控制在1…

算法优选系列(9.BFS 解决拓扑排序)

目录 拓扑排序简介&#xff1a; ​编辑 课程表&#xff08;medium&#xff09;&#xff1a; 课程表II&#xff08;medium&#xff09;: 火星词典&#xff08;hard&#xff09;&#xff1a; 拓扑排序简介&#xff1a; 有向无环图&#xff08;DAG图&#xff09; 如上图每条边…

SpringBoot3+Vue3(1)-后端 请求头校验,jwt退出登录,mybaits实现数据库用户校验

1.后端&#xff1a;jwt请求头校验 解析 工具类jwtUtils 解析token 令牌是否过期&#xff0c;验证 正常、异常、运行时错误 倒入工具类是resource 工具类中添加解析用户的方法&#xff1a; 在 在工具类添加id解析 此处调用 添加controller做测试 测试&…

【免杀】C2免杀技术(八)APC注入

本文主要写点自己的理解&#xff0c;如有问题&#xff0c;请诸位指出&#xff01; 概念和流程 “APC注入”&#xff08;APC Injection&#xff09;是免杀与恶意代码注入技术中的一种典型方法&#xff0c;主要用于在目标进程中远程执行代码&#xff0c;常见于后门、远控、植入型…

git工具使用

安装Git 在开始使用Git之前&#xff0c;需要在本地计算机上安装Git工具。Git支持Windows、macOS和Linux系统。可以从Git官方网站下载适合操作系统的安装包&#xff0c;并按照安装向导进行安装。 bash复制插入 # 在Linux上安装Git sudo apt-get install git# 在macOS上安装Git…

SpringBoot微服务编写Dockerfile流程及问题汇总

背景 跟 Docker 磕了两天&#xff0c;将一个包含 N 个微服务的应用部署包改造&#xff0c;使其能够生成 Docker 镜像&#xff0c;并在 Docker 容器中运行。几年前玩过 Docker&#xff0c;隐约记得几个命令「Dockerfile 命令&#xff1a;黑卡饮料、山楂果费、哦SUV&#xff0c;…