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

用openCV实现基础的人脸检测与情绪识别

一.引言

       人脸检测与情绪识别技术在当今现代社会有着举足轻重的地位,这篇文章将会从一个新手小白的角度,一步一步教会如何实现一个简单的人脸检测和情绪识别的技术。

二.使用的软件与环境的搭建

1.vscode

(1)下载网址:

Visual Studio Code - Code Editing. Redefinedhttps://code.visualstudio.com/

(2)安装建议:建议在安装时勾选所有内容:

 2.python解释器

(1)下载网址:

Python Releases for Windows | Python.orghttps://www.python.org/downloads/windows/

(2)安装建议(一定要注意):

请务必要点击Add Python 3.9 to PATH!

3.在vscode中安装插件

(1)配置中文:

(2)安装python插件:

4.opencv

(1)openCV的介绍:

       OpenCV是一个免费的开源工具,能帮电脑轻松处理图片和视频,比如识别人脸或检测物体。它支持多种编程语言,包括Python、C++和Java,让你能用熟悉的语言快速上手开发。OpenCV的强大之处在于它功能超全且社区庞大,比如有数千种预建算法,让图像处理任务变得简单高效,新手也能快速实现酷炫效果。

(2)openCV的安装:

请按照菜鸟教程的此页来一步一步安装openCV:

OpenCV 安装 | 菜鸟教程 (runoob.com)https://www.runoob.com/opencv/opencv-install.html

三.从零开始完成一个人脸检测和情绪识别技术(无脑版)

1.在桌面建一个文件夹,并且命名:

2.打开vscode,找到刚才新建好的文件夹并且打开:

3.点击终端,弹出如下窗口:

4. 创建虚拟环境,输入以下代码,回车:

python -m venv face_venv

5. 激活虚拟环境,输入以下代码,回车:

.\face_venv\Scripts\activate

在虚拟环境被激活后,会在前面出现绿色的代码:

6.安装必要的库,输入以下代码,回车:

pip install opencv-python mediapipe deepface matplotlib

7.如果有提示信息,升级pip,并尝试重新安装mediapipe,如果没有,请跳过这一步:

输入以下代码,更新pip:

python.exe -m pip install --upgrade pip

输入以下代码,重新安装mediapipe:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple mediapipe

8. 安装tensorflow,输入以下代码,回车:

pip install tensorflow

9. 安装tf-keras,输入以下代码,回车:

pip install tf-keras

10. 分别创建以下几个文件:

main.py               # 主程序入口
face_detector.py      # 人脸检测模块
emotion_detector.py   # 情绪识别模块
utils.py              # 工具函数
requirements.txt      # 依赖库清单

11. 将以下代码分别复制到不同的文件里:

main.py:

import cv2
from face_detector import FaceDetector
from emotion_detector import EmotionDetector# 初始化检测器
face_detector = FaceDetector()
emotion_detector = EmotionDetector()# 打开摄像头并设置较低分辨率(优化性能)
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)  # 降低宽度
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) # 降低高度while True:ret, frame = cap.read()if not ret:break# 人脸检测和关键点检测(每帧都进行)frame, faces = face_detector.detect(frame)# 对每个检测到的人脸进行情绪识别for (x, y, w, h) in faces:face_roi = frame[y:y+h, x:x+w]if len(face_roi) > 0:# 情绪检测emotion, confidence = emotion_detector.detect_emotion(face_roi)# 在原图上显示情绪结果cv2.putText(frame, f"Emotion: {emotion} ({confidence:.2f})",(x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)# 显示帧率信息(帮助监控性能)fps = cap.get(cv2.CAP_PROP_FPS)cv2.putText(frame, f"FPS: {fps:.1f}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)# 显示结果cv2.imshow('Face and Emotion Detection', frame)# 按 'q' 键退出if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放资源
cap.release()
cv2.destroyAllWindows()

 face_detector.py:

import cv2
import mediapipe as mpclass FaceDetector:def __init__(self, min_detection_confidence=0.5, min_tracking_confidence=0.5):# 人脸检测模型(用于边界框)self.mp_face_detection = mp.solutions.face_detectionself.face_detection = self.mp_face_detection.FaceDetection(min_detection_confidence=min_detection_confidence)# 人脸关键点模型(468点,复用官方示例逻辑)self.mp_face_mesh = mp.solutions.face_meshself.face_mesh = self.mp_face_mesh.FaceMesh(static_image_mode=False,max_num_faces=1,refine_landmarks=True,  # 必须开启!优化关键点min_detection_confidence=min_detection_confidence,min_tracking_confidence=min_tracking_confidence)self.mp_drawing = mp.solutions.drawing_utils  # 官方绘制工具def detect(self, image):# 转换为RGB(Mediapipe要求)image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)h, w, c = image.shape# 1. 人脸边界框检测(原功能)face_results = self.face_detection.process(image_rgb)faces = []if face_results.detections:for detection in face_results.detections:bbox = detection.location_data.relative_bounding_boxx, y, w_box, h_box = int(bbox.xmin * w), int(bbox.ymin * h), \int(bbox.width * w), int(bbox.height * h)faces.append((x, y, w_box, h_box))# 绘制人脸边界框(绿色)cv2.rectangle(image, (x, y), (x + w_box, y + h_box), (0, 255, 0), 2)# 2. 人脸关键点检测(复用官方示例的绘制逻辑)mesh_results = self.face_mesh.process(image_rgb)if mesh_results.multi_face_landmarks:for face_landmarks in mesh_results.multi_face_landmarks:# 用官方工具绘制关键点(和 test_face_mesh.py 效果一致)self.mp_drawing.draw_landmarks(image=image,landmark_list=face_landmarks,connections=self.mp_face_mesh.FACEMESH_TESSELATION,  # 绿色网格landmark_drawing_spec=None,connection_drawing_spec=self.mp_drawing.DrawingSpec(color=(0, 255, 0),  # 绿色thickness=1, circle_radius=1))return image, faces

emotion_detector.py :

from deepface import DeepFace
import cv2class EmotionDetector:def __init__(self):# 支持的情绪类别self.emotions = ['angry', 'disgust', 'fear', 'happy', 'sad', 'surprise', 'neutral']def detect_emotion(self, face_image):try:# 使用DeepFace进行情绪分析result = DeepFace.analyze(face_image, actions=['emotion'], enforce_detection=False)emotion = result[0]['dominant_emotion']emotion_probability = result[0]['emotion'][emotion]return emotion, emotion_probabilityexcept Exception as e:print(f"Error detecting emotion: {e}")return "neutral", 0.5

utils.py: 

import cv2def draw_text(image, text, position, font_scale=1, color=(0, 255, 0), thickness=2):# 在图像上绘制文本cv2.putText(image, text, position, cv2.FONT_HERSHEY_SIMPLEX, font_scale, color, thickness, cv2.LINE_AA)return image

requirements.txt:

opencv-python
mediapipe
deepface
matplotlib

12.最后,打开main.py模块,点击运行并稍等片刻,就可以显示实时动态情绪了:

四. 从技术的层面解释上述操作 

1.人脸检测技术解析:

人脸检测是整个系统的基础,这里使用了 Mediapipe 库来实现这一功能:

# 人脸检测模型(用于边界框)
self.mp_face_detection = mp.solutions.face_detection
self.face_detection = self.mp_face_detection.FaceDetection(min_detection_confidence=min_detection_confidence
)

技术原理: 

Mediapipe 的人脸检测采用了轻量级神经网络模型,它基于单次多框检测器 (SSD) 架构,通过以下步骤工作:

  • 首先使用卷积神经网络提取图像特征
  • 然后在不同尺度的特征图上检测人脸
  • 最后通过边界框回归精确定位人脸位置

 除了边界框,还使用了 Mediapipe 的人脸网格模型检测 468 个面部关键点:

# 人脸关键点模型(468点)
self.mp_face_mesh = mp.solutions.face_mesh
self.face_mesh = self.mp_face_mesh.FaceMesh(refine_landmarks=True,  # 开启精细化关键点...
)

 这些关键点覆盖了眼睛、眉毛、鼻子、嘴巴等面部结构,对于后续的情绪分析非常重要。

2.情绪识别技术解析 :

情绪识别是系统的核心功能,这里使用了 DeepFace 库:

def detect_emotion(self, face_image):result = DeepFace.analyze(face_image, actions=['emotion'], enforce_detection=False)emotion = result[0]['dominant_emotion']return emotion, emotion_probability

DeepFace 是一个强大的人脸识别和分析库,它的情绪识别功能基于以下技术:

  1. 面部特征提取:使用预训练的卷积神经网络 (CNN) 提取面部图像的特征向量
  2. 情绪分类:将提取的特征向量输入到分类器中,识别出 7 种基本情绪
    • 愤怒 (angry)
    • 厌恶 (disgust)
    • 恐惧 (fear)
    • 快乐 (happy)
    • 悲伤 (sad)
    • 惊讶 (surprise)
    • 中性 (neutral)

DeepFace 的情绪识别模型在多个公开数据集上训练,包括:

  • FER2013:包含 28,709 张人脸图像,标注了 7 种基本情绪
  • RAF-DB:包含 29,672 张人脸图像,提供了更精细的情绪标注
  • AffectNet:包含超过 1,000,000 张人脸图像,是目前最大的面部表情数据集

 3. 系统整体工作流程:

  1. 初始化阶段

    • 创建 FaceDetector 和 EmotionDetector 实例
    • 打开摄像头并设置分辨率
  2. 循环处理阶段

    • 读取摄像头帧
    • 使用 Mediapipe 检测人脸边界框和关键点
    • 对每个检测到的人脸区域:
      • 提取人脸图像
      • 使用 DeepFace 分析情绪
      • 在原图上标注情绪结果
    • 显示处理后的图像和 FPS 信息
  3. 资源释放

    • 释放摄像头资源
    • 关闭所有 OpenCV 窗口

五. 从新手的角度解释基础

1. VSCode - 你的代码编辑器

VSCode 是一个专门用来写代码的软件,就像 Word 文档编辑器一样,但它是用来写程序的。你可以把它想象成一个「超级记事本」:

  • 特点
    • 有很多颜色和格式(代码高亮),让不同类型的代码看起来不一样
    • 可以安装各种插件(比如 Python 支持、自动补全、错误检查)
    • 能直接运行和调试代码

你为什么需要它
写代码不能用普通记事本,因为普通记事本没有代码的颜色和格式,也不能帮你检查错误。VSCode 让写代码变得又快又容易。

2. Python - 你使用的编程语言

Python 是一种编程语言,就像英语、中文一样,只是它是和计算机交流的语言。

  • 特点
    • 语法简单,容易学习(用英文单词和符号,不需要复杂的符号)
    • 功能强大,可以做网站、数据分析、人工智能等
    • 有很多「库」可以直接用

你为什么需要它
你写的人脸检测和情绪识别程序就是用 Python 写的。没有 Python,计算机就看不懂你写的代码。

3. OpenCV - 计算机视觉的工具箱

OpenCV 是一个专门用于「计算机视觉」的 Python 库。什么是计算机视觉?就是让计算机「看」和理解图像内容。

  • OpenCV 能做什么
    • 读取和显示图片 / 视频(比如你用它打开摄像头)
    • 处理图像(比如裁剪、缩放、调整颜色)
    • 识别物体(比如人脸、猫、狗等)
    • 分析运动(比如跟踪一个人在画面中的移动)

在你的代码里

import cv2  # 这行代码就是在导入OpenCV库# 下面这行是用OpenCV打开摄像头
cap = cv2.VideoCapture(0)

4. Mediapipe 和 DeepFace - 预训练好的 AI 模型库

Mediapipe 和 DeepFace 都是别人已经训练好的「人工智能模型库」,它们就像现成的工具包,你拿过来就能用。

Mediapipe 是 Google 开发的库,专门用于检测人脸、手部、姿势等。

DeepFace 是专门用于人脸识别和分析的库,它可以:

  • 识别情绪(开心、难过、生气等)

  • 识别面部特征(眼睛、鼻子、嘴巴的形状)

  • 判断两张脸是否是同一个人

5. 虚拟环境 - 代码的「隔离房间」

虚拟环境 是一个独立的、隔离的空间,你可以在里面安装特定版本的 Python 和库。

  • 为什么需要虚拟环境
    • 不同的项目可能需要不同版本的库
    • 虚拟环境可以避免库之间的冲突
    • 方便分享项目,别人可以完全复制你的环境

如何创建虚拟环境(以 Windows 为例):

# 1. 打开命令提示符
# 2. 进入你的项目文件夹
cd C:\path\to\your\project# 3. 创建虚拟环境
python -m venv myenv# 4. 激活虚拟环境
myenv\Scripts\activate  # Windows
source myenv/bin/activate  # macOS/Linux

6. 安装各种库 - 就像安装手机应用

在 Python 里,安装库非常简单,用一个叫 pip 的工具(类似于手机的应用商店)。

安装你项目需要的库

# 确保你的虚拟环境已激活# 安装OpenCV
pip install opencv-python# 安装Mediapipe
pip install mediapipe# 安装DeepFace
pip install deepface# 安装Matplotlib(用于绘图,你的代码里可能会用到)
pip install matplotlib

为什么需要这些库

  • opencv-python:处理图像和视频
  • mediapipe:人脸检测和关键点识别
  • deepface:情绪识别
  • matplotlib:数据可视化(比如绘制情绪分析结果)

7. 总结 - 整个流程像搭积木

你的项目就像一个积木塔,每一层都是一个工具或技术:

  1. 底层工具

    • VSCode:写代码的编辑器
    • Python:编程语言
    • 虚拟环境:隔离的工作空间
  2. 中间层库

    • OpenCV:处理图像和视频
    • Mediapipe:人脸检测和关键点识别
    • DeepFace:情绪识别
  3. 顶层应用

    • 你的代码:把上面所有工具组合起来,实现人脸情绪识别的功能

http://www.lqws.cn/news/594613.html

相关文章:

  • 华为交换机堆叠与集群技术深度解析附带脚本
  • Sketch v2025「Athens」全新发布,3大更新重塑UI/UX设计的关键逻辑
  • stm32 单片机主要优点有哪些?
  • SAP ABAP 中 AMDP 简介及实现方法
  • Spring Boot 集成 Dufs 通过 WebDAV 实现文件管理
  • ES05 - 集群的运维和安全
  • 玄机——第一章应急响应-Linux日志分析
  • AILiquid线上AMA首秀,全链AI驱动的去中心化合约平台引发关注
  • 【项目笔记】高并发内存池项目剖析(二)
  • npm list的使用方法详细介绍
  • 【开源项目】一款真正可修改视频MD5工具视频质量不损失
  • uniapp+vue写小程序页面,实现一张图片默认放大后,可以在容器内上下左右拖动查看
  • 前端第二节(Vue)
  • 【实战】 容器中Spring boot项目 Graphics2D 画图中文乱码解决方案
  • anchor 智能合约案例3 之 journal
  • Docker进阶命令与参数——AI教你学Docker
  • 想做跑腿配送生意,怎么第三方平台订单对接?
  • MCU、LIN收发器、LIN总线、节点,它们之间是如何协作的?
  • SVN 分支管理(本文以Unity项目为例)
  • 以下是 Kafka 不同认证方式的配置示例,结合前面的单表设计方案,展示如何为每种认证方式填充配置表
  • 【Go-选项模式】
  • Spring Boot 2 多模块项目中配置文件的加载顺序
  • 2025年主流大厂Java后端面试题主题深度解析
  • 【深度学习新浪潮】人工智能在文物考古领域有哪些最新研究进展?
  • 基于开源AI大模型AI智能名片S2B2C商城小程序的流量转化与价值沉淀研究
  • 借助飞算AI新手小白快速入门Java实操记录
  • AbMole| H₂DCFDA(M9096;活性氧(ROS)探针)
  • C#基础(DllImport)
  • CppCon 2018 学习:Better C++ using Machine Learning on Large Projects
  • [Python 基础课程]字符串