提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
在智能科技不断渗透我们日常生活的今天,人体姿态检测技术已成为计算机视觉领域的一项重要研究方向。它不仅为运动分析、交互娱乐、安全监控等领域带来了创新应用,还为人们的日常生活带来了诸多便利。本项目将采用MediaPipe这一强大的开源跨平台机器学习解决方案,结合OpenCV这一广泛使用的计算机视觉库,实现对人体姿态的实时检测。
一、MediaPipe是什么?
MediaPipe是由Google Research开发的一款强大且灵活的跨平台机器学习解决方案框架。它为开发者提供了一系列工具和预训练模型,用于实现面部识别、手势追踪、姿态估计、物体检测等多种计算机视觉和音频处理任务。MediaPipe的设计理念在于模块化和可定制性,使得开发者能够轻松构建复杂的数据流处理管道。其支持多种编程语言,包括C++、Python和Java,能够在不同的操作系统上运行,如Linux、Windows、macOS、Android和iOS。MediaPipe的高性能和低延迟特性使其在移动设备和边缘设备上也能实现实时处理。此外,MediaPipe的开源性质促进了技术的共享和社区的协作,为创新应用的开发提供了无限可能,广泛应用于交互式增强现实、健康监测、智能监控和特殊需求辅助等领域。
二、MediaPipe使用:
本次姿态检测使用的是mediapipe.solutions.pose方法,mp.solutions.pose是MediaPipe框架中专门用于人体姿态估计的解决方案。该解决方案提供了一个预先训练好的模型,可以实时检测和追踪视频中人物的33个身体关键点,包括头部、肩部、肘部、手腕、臀部、膝盖和脚踝等。以下是mp.solutions.pose的主要特点和功能:
主要特点:
实时检测:mp.solutions.pose能够以较高的帧率运行,适合实时应用场景。
精确度高:该解决方案使用了先进的机器学习技术,可以准确地识别和追踪身体关键点。
跨平台:支持多种操作系统和设备,包括移动设备和桌面计算机。
易于集成:通过MediaPipe提供的Python API,可以轻松地将姿态估计功能集成到各种应用中。
关键组件:
Pose类:这是mp.solutions.pose中的主要类,用于创建一个姿态估计器实例。
process方法:用于处理输入的图像帧并返回姿态检测结果。它需要一个RGB格式的图像作为输入。
pose_landmarks:检测结果的属性,包含了检测到的身体关键点的坐标和可见性。
POSE_CONNECTIONS:一个列表,定义了身体关键点之间的连接关系,用于在图像上绘制姿态连接线。
其中Pose类 是 MediaPipe 框架中用于实现人体姿态估计功能的类。这个类封装了所有必要的逻辑,包括加载预训练模型、处理输入图像以及输出人体关键点的坐标。以下是 mp_pose.Pose 类的详细介绍:
mp_pose.Pose(static_image_mode=False, model_complexity=1, smooth_landmarks=True, enable_segmentation=False, smooth_segmentation=True, min_detection_confidence=0.5, min_tracking_confidence=0.5)
参数说明:
static_image_mode:布尔值,表示是否启用静态图像模式。在静态图像模式下,模型会对每一帧图像都进行完整的姿态检测,而不是追踪连续帧中的姿态。
model_complexity:整数,表示模型的复杂度。0 是最简单模型,2 是最复杂模型。较高的模型复杂度可以提供更精确的检测结果,但需要更多的计算资源。
smooth_landmarks:布尔值,表示是否对检测到的关键点进行平滑处理,以减少抖动。
enable_segmentation:布尔值,表示是否启用身体部位分割功能。
smooth_segmentation:布尔值,表示是否对分割结果进行平滑处理。
min_detection_confidence:浮点数,表示检测姿态的最小置信度阈值。低于此阈值的结果将被忽略。
min_tracking_confidence:浮点数,表示追踪姿态的最小置信度阈值。在追踪模式下,如果置信度低于此阈值,将重新进行姿态检测。
主要方法:
三、算法流程:
首先初始化Pose对象:在创建Pose对象时,可以设置多个参数来配置模型的行为,如是否启用静态图像模式、模型复杂度、是否平滑关键点、是否启用分割等。
然后处理图像帧:通过调用process方法,传入RGB图像帧,模型将返回包含姿态估计结果的对象。最后可视化结果:使用mp.solutions.drawing_utils中的draw_landmarks方法,可以在原始图像上绘制检测到的关键点和连接线。
整体代码:
# 导入OpenCV库,用于图像处理
import cv2
# 导入time库,用于处理时间相关的功能
import time
# 导入mediapipe库,用于使用其提供的机器学习解决方案
import mediapipe as mp
# 导入tqdm库,用于在循环中显示进度条
from tqdm import tqdm
# 导入mediapipe的姿态估计solution
mp_pose = mp.solutions.pose
# 导入mediapipe的绘图工具,用于在图像上绘制关键点和连接线
mp_drawing = mp.solutions.drawing_utils
# 创建Pose模型实例,配置模型参数
pose = mp_pose.Pose(static_image_mode=False,
model_complexity=1,
smooth_landmarks=True,
enable_segmentation=True,
min_detection_confidence=0.5,
min_tracking_confidence=0.5)
# 定义处理单帧图像的函数
def process_frame(img):
# 将图像从BGR颜色空间转换到RGB颜色空间
img_RGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 使用Pose模型处理RGB图像,获取姿态估计结果
results = pose.process(img_RGB)
# 在图像上绘制姿态估计的关键点和连接线
mp_drawing.draw_landmarks(img, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)
# 返回处理后的图像
return img
# 指定待处理的图片路径
image_path = r'F:\cv_traditional\OIP-C (1).jfif'
# 使用OpenCV读取图片
img = cv2.imread(image_path)
# 处理读取的图片
frame = process_frame(img)
# 创建窗口并显示处理后的图像
cv2.imshow('my_window', frame)
# 等待用户按键,按键后继续执行
cv2.waitKey(0)
# 销毁所有OpenCV创建的窗口
cv2.destroyAllWindows()
四、效果:
原图:
效果图: