基于MediaPipe实现人体姿态与脸部关键点检测

在计算机视觉领域,人体姿态检测和脸部关键点检测是应用广泛的技术方向,无论是直播美颜、运动分析还是人机交互,都能看到它们的身影。MediaPipe作为Google开源的多媒体处理框架,提供了开箱即用的姿态和人脸检测解决方案,极大降低了开发门槛。本文将详细介绍如何使用MediaPipe结合OpenCV实现人体姿态检测和脸部关键点检测。

一、环境准备

在开始编码前,需要先安装相关依赖库:

bash 复制代码
pip install opencv-python mediapipe

• opencv-python:用于图像/视频的读取、处理和显示;

• mediapipe:提供预训练的姿态检测和人脸关键点检测模型。

二、人体姿态检测实现

1. 核心原理

MediaPipe的Pose模型可以检测人体33个关键节点(如鼻子、肩膀、手肘、膝盖等),返回每个节点的三维坐标(x/y/z),并支持关键点平滑、人体抠图等功能。

2. 完整代码实现
python 复制代码
import cv2
import mediapipe as mp

if __name__ == '__main__':
    # 初始化MediaPipe Pose模块
    mp_pose = mp.solutions.pose
    # 配置Pose模型参数
    pose = mp_pose.Pose(
        static_image_mode=True,        # 静态图像模式(处理单张图片)
        model_complexity=1,            # 模型复杂度:0(快/精度低)、1(平衡)、2(慢/精度高)
        smooth_landmarks=True,         # 平滑关键点,减少抖动
        min_detection_confidence=0.5,  # 检测置信度阈值
        min_tracking_confidence=0.5    # 跟踪置信度阈值
    )
    # 初始化绘图工具
    drawing = mp.solutions.drawing_utils

    # 读取图像并转换颜色空间(OpenCV默认BGR,MediaPipe需要RGB)
    img = cv2.imread("1111.png")
    cv2.imshow("input", img)
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    
    # 处理图像,获取姿态关键点
    results = pose.process(img_rgb)
    
    # 将图像转回BGR格式,用于OpenCV显示
    img_bgr = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2BGR)

    # 输出关键点数量并打印每个关键点的三维坐标
    if results.pose_landmarks:
        print(f"人体姿态关键点数量:{len(results.pose_landmarks.landmark)}")
        for i in range(len(results.pose_landmarks.landmark)):
            x = results.pose_landmarks.landmark[i].x  # 归一化x坐标(0-1)
            y = results.pose_landmarks.landmark[i].y  # 归一化y坐标(0-1)
            z = results.pose_landmarks.landmark[i].z  # 归一化z坐标(深度)
            print(f"关键点{i}:x={x:.4f}, y={y:.4f}, z={z:.4f}")
        
        # 绘制关键点和连接线条
        drawing.draw_landmarks(img_bgr, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)
    
    # 显示结果图像
    cv2.imshow("keypoint", img_bgr)
    # 绘制3D姿态关键点(单独窗口)
    drawing.plot_landmarks(results.pose_world_landmarks, mp_pose.POSE_CONNECTIONS)

    # 等待按键后释放资源
    cv2.waitKey(0)
    cv2.destroyAllWindows()
3. 关键参数说明

• static_image_mode:是否为静态图像模式,处理单张图片时设为True,处理视频流时设为False;

• model_complexity:模型复杂度,取值0/1/2,数值越大精度越高但速度越慢;

• smooth_landmarks:是否平滑关键点,减少检测结果的抖动;

• min_detection_confidence:检测置信度阈值,低于该值的检测结果会被忽略;

• min_tracking_confidence:视频流跟踪置信度阈值,低于该值会重新触发检测。

三、脸部关键点检测(实时摄像头版)

1. 核心原理

MediaPipe的Face Mesh模型可以检测人脸478个关键点,覆盖眼睛、鼻子、嘴巴、脸颊等区域,支持多脸检测,适合实时处理摄像头画面。

2. 完整代码实现
python 复制代码
import cv2
import mediapipe as mp

# 初始化MediaPipe Face Mesh模块
mp_face_mesh = mp.solutions.face_mesh
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles

# 配置Face Mesh参数
face_mesh = mp_face_mesh.FaceMesh(
    static_image_mode=False,       # 视频流模式
    max_num_faces=2,               # 最多检测2张人脸
    refine_landmarks=True,         # 细化关键点(提升眼睛/嘴唇区域精度)
    min_detection_confidence=0.5,  # 检测置信度阈值
    min_tracking_confidence=0.5    # 跟踪置信度阈值
)

# 打开摄像头(0表示默认摄像头)
cap = cv2.VideoCapture(0)

while cap.isOpened():
    success, frame = cap.read()
    if not success:
        print("无法读取摄像头画面")
        break
    
    h, w = frame.shape[:2]  # 获取画面宽高
    # 转换颜色空间(BGR→RGB)
    frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    # 处理画面,获取人脸关键点
    results = face_mesh.process(frame_rgb)

    # 绘制人脸关键点
    if results.multi_face_landmarks:
        for face_landmarks in results.multi_face_landmarks:
            # 打印关键点数量(固定478个)
            # print(f"人脸关键点数量:{len(face_landmarks.landmark)}")
            
            # 绘制每个关键点的编号
            for i in range(len(face_landmarks.landmark)):
                x = face_landmarks.landmark[i].x
                y = face_landmarks.landmark[i].y
                # 将归一化坐标转换为像素坐标
                px = int(x * w)
                py = int(y * h)
                # 在画面上绘制关键点编号
                cv2.putText(frame, str(i), (px, py), 
                            cv2.FONT_HERSHEY_SIMPLEX, 0.3, (0, 255, 0), 1)
            
            # 绘制人脸网格(三角剖分)
            mp_drawing.draw_landmarks(
                image=frame,
                landmark_list=face_landmarks,
                connections=mp_face_mesh.FACEMESH_TESSELATION,
                landmark_drawing_spec=None,
                connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_tesselation_style()
            )

    # 显示结果画面
    cv2.imshow('Face Mesh', frame)
    # 按ESC键退出(27是ESC的ASCII码)
    if cv2.waitKey(1) == 27:
        break

# 释放摄像头资源并关闭窗口
cap.release()
cv2.destroyAllWindows()
3. 关键功能说明

• max_num_faces:设置最多检测的人脸数量,适合多人场景;

• refine_landmarks:开启后会细化眼睛和嘴唇区域的关键点,提升精度;

• FACEMESH_TESSELATION:绘制人脸三角网格,直观展示关键点连接关系;

• 关键点编号绘制:通过cv2.putText在每个关键点位置标注编号,便于后续针对性处理(如定位眼睛、嘴巴)。

四、扩展与优化

  1. 视频文件处理:将摄像头读取(cv2.VideoCapture(0))改为视频文件路径(cv2.VideoCapture("video.mp4")),即可处理本地视频;

  2. 关键点应用:

◦ 姿态检测:可提取特定关键点(如肩膀、膝盖)分析人体动作(如深蹲、俯卧撑计数);

◦ 人脸检测:可基于眼睛关键点实现眨眼检测,基于嘴巴关键点实现表情识别;

  1. 性能优化:

◦ 降低模型复杂度(如姿态检测设model_complexity=0)提升实时性;

◦ 缩小输入图像尺寸(如cv2.resize)减少计算量;

  1. 结果保存:使用cv2.imwrite保存检测后的图片,或cv2.VideoWriter保存视频流结果。

五、总结

MediaPipe结合OpenCV提供了简洁高效的姿态和人脸检测方案,无需手动训练模型,仅需几行代码即可实现高精度的关键点检测。无论是快速原型验证还是实际项目开发,这套组合都能大幅提升开发效率。希望本文能帮助大家快速上手MediaPipe,解锁更多计算机视觉应用场景。

相关推荐
笨鸟先飞,勤能补拙6 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
长和信泰光伏储能7 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
江畔柳前堤7 小时前
信号的本质——从模拟波形到AI中的数据张量
人工智能·深度学习·机器学习·计算机视觉·数据挖掘·语音识别
浦信仿真大讲堂7 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
Gu Gu Study8 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
卷无止境8 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境8 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd1239 小时前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
江畔柳前堤9 小时前
系统的本质——从LTI系统到神经网络
人工智能·深度学习·神经网络·机器学习·计算机视觉·数据挖掘·语音识别
Dxy12393102169 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python