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

发布于:2025-07-02 ⋅ 阅读:(37) ⋅ 点赞:(0)

一.引言

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

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

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 mp

class FaceDetector:
    def __init__(self, min_detection_confidence=0.5, min_tracking_confidence=0.5):
        # 人脸检测模型(用于边界框)
        self.mp_face_detection = mp.solutions.face_detection
        self.face_detection = self.mp_face_detection.FaceDetection(
            min_detection_confidence=min_detection_confidence
        )
        
        # 人脸关键点模型(468点,复用官方示例逻辑)
        self.mp_face_mesh = mp.solutions.face_mesh
        self.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_box
                x, 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 cv2

class 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_probability
        except Exception as e:
            print(f"Error detecting emotion: {e}")
            return "neutral", 0.5

utils.py: 

import cv2

def 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. 顶层应用

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


网站公告

今日签到

点亮在社区的每一天
去签到