郑州市网站建设_网站建设公司_悬停效果_seo优化
2026/1/13 7:40:12 网站建设 项目流程

AI人体骨骼检测结果导出:CSV/Excel格式转换教程

1. 引言

1.1 学习目标

本文将带你掌握如何从AI 人体骨骼关键点检测系统(基于 Google MediaPipe)中,提取并结构化输出 33 个关节点的坐标数据,最终实现以CSV 和 Excel 文件格式保存的完整流程。无论你是做运动分析、姿态评估还是行为识别研究,本教程都能帮助你快速将视觉检测结果转化为可分析的数据集。

学完本文后,你将能够: - 理解 MediaPipe Pose 输出的关键点数据结构 - 编写 Python 脚本提取关键点坐标(x, y, z, visibility) - 将多帧或多图像的姿态数据批量导出为 CSV 文件 - 使用pandas进一步生成带标签的 Excel 表格 - 在 WebUI 应用中集成“一键导出”功能

1.2 前置知识

建议具备以下基础: - 基础 Python 编程能力 - 了解 NumPy 和 Pandas 数据处理库 - 熟悉 OpenCV 或图像处理基本概念(非必须)

💡 本文适用于本地部署的 MediaPipe Pose 镜像环境,所有代码均可在 CPU 上高效运行。


2. 技术背景与数据结构解析

2.1 MediaPipe Pose 模型简介

MediaPipe Pose 是 Google 开发的轻量级人体姿态估计模型,能够在普通 CPU 上实现实时推理。它通过单张 RGB 图像预测33 个 3D 关键点,包括:

  • 面部特征点(如鼻子、眼睛)
  • 上肢(肩、肘、腕)
  • 下肢(髋、膝、踝)
  • 躯干与脊柱连接点

每个关键点包含四个维度: -x,y:归一化图像坐标(0~1) -z:深度信息(相对深度,单位与 x 相同) -visibility:置信度分数(越接近 1 越可靠)

这些数据以landmark列表形式返回,是后续导出的核心来源。

2.2 关键点索引对照表

以下是部分常用关键点的索引编号(共 33 个):

索引名称描述
0nose鼻子
11left_shoulder左肩
13left_elbow左肘
15left_wrist左手腕
23left_hip左髋
25left_knee左膝
27left_ankle左脚踝
12right_shoulder右肩
14right_elbow右肘
16right_wrist右手腕
24right_hip右髋
26right_knee右膝
28right_ankle右脚踝

📌 提示:可通过mp_pose.PoseLandmark枚举类直接调用名称,避免硬编码索引。


3. 实现步骤详解

3.1 环境准备与依赖安装

确保你的环境中已安装以下库:

pip install mediapipe opencv-python pandas openpyxl
  • mediapipe:核心姿态检测模型
  • opencv-python:图像读取与绘制
  • pandas:数据整理与导出
  • openpyxl:支持 Excel (.xlsx) 写入

3.2 单张图像关键点提取

以下代码展示如何加载图像、执行检测并提取原始坐标数据:

import cv2 import mediapipe as mp import numpy as np # 初始化 MediaPipe Pose 模型 mp_pose = mp.solutions.pose pose = mp_pose.Pose( static_image_mode=True, model_complexity=1, enable_segmentation=False, min_detection_confidence=0.5 ) # 读取图像 image_path = 'person.jpg' image = cv2.imread(image_path) rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 执行姿态检测 results = pose.process(rgb_image) # 提取关键点数据 if results.pose_landmarks: landmarks = [] for idx, landmark in enumerate(results.pose_landmarks.landmark): # 将归一化坐标转为像素值(可选) h, w, _ = image.shape cx, cy = int(landmark.x * w), int(landmark.y * h) cz = landmark.z visibility = landmark.visibility landmarks.append({ 'index': idx, 'name': mp_pose.PoseLandmark(idx).name, 'x_norm': landmark.x, 'y_norm': landmark.y, 'z': cz, 'visibility': visibility, 'x_pixel': cx, 'y_pixel': cy }) print(f"✅ 成功提取 {len(landmarks)} 个关键点") else: print("❌ 未检测到人体")

📌说明: - 使用static_image_mode=True保证高精度静态图检测 - 返回的landmark是归一化坐标,乘以图像宽高可得像素位置 -visibility字段可用于后期过滤低置信度点

3.3 导出为 CSV 文件

将上述landmarks列表保存为 CSV 格式,便于后续分析:

import pandas as pd # 转换为 DataFrame df = pd.DataFrame(landmarks) # 保存为 CSV output_csv = 'skeleton_keypoints.csv' df.to_csv(output_csv, index=False) print(f"📁 关键点数据已保存至: {output_csv}")

生成的 CSV 文件包含如下字段:

index,name,x_norm,y_norm,z,visibility,x_pixel,y_pixel 0,nose,0.492,0.312,-0.003,0.998,984,624 1,left_eye_inner,0.488,0.305,...,... ...

3.4 批量处理多张图像并合并数据

若需对多个动作或视频帧进行分析,可遍历文件夹并汇总所有数据:

import os from glob import glob def process_images_in_folder(folder_path): all_data = [] for img_file in sorted(glob(os.path.join(folder_path, "*.jpg"))): image = cv2.imread(img_file) rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) results = pose.process(rgb_image) if not results.pose_landmarks: continue frame_data = [] for idx, landmark in enumerate(results.pose_landmarks.landmark): frame_data.append({ 'frame': os.path.basename(img_file), 'index': idx, 'name': mp_pose.PoseLandmark(idx).name, 'x_norm': landmark.x, 'y_norm': landmark.y, 'z': landmark.z, 'visibility': landmark.visibility }) all_data.extend(frame_data) return pd.DataFrame(all_data) # 示例调用 df_batch = process_images_in_folder('./images/') df_batch.to_csv('batch_skeleton_data.csv', index=False) print("📊 批量数据已导出")

此方法适合用于: - 视频逐帧抽样分析 - 不同动作对比实验 - 训练数据预处理

3.5 导出为 Excel 多工作表格式

使用pandas.ExcelWriter可创建结构化 Excel 文件,提升可读性:

with pd.ExcelWriter('skeleton_analysis.xlsx') as writer: # 主表:所有关键点坐标 df.to_excel(writer, sheet_name='Keypoints_Raw', index=False) # 统计表:可见性分布 visibility_stats = df.groupby('name')['visibility'].mean().reset_index() visibility_stats.to_excel(writer, sheet_name='Visibility_Summary', index=False) # 动作摘要(示例) summary_df = pd.DataFrame([{ 'total_frames': 1, 'detected_keypoints': len(df), 'avg_visibility': df['visibility'].mean(), 'notes': 'Standing pose' }]) summary_df.to_excel(writer, sheet_name='Summary', index=False) print("📄 数据已导出至 Excel,含多个工作表")

生成的.xlsx文件包含三个标签页,方便研究人员直接查看和筛选。


4. WebUI 中集成导出功能(进阶)

如果你使用的是带有 WebUI 的镜像平台(如 Gradio 或 Flask),可以添加一个“导出按钮”,让用户点击即可下载 CSV/Excel。

4.1 使用 Gradio 实现导出接口

import gradio as gr def detect_and_export(image): # 执行检测(同上) rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) results = pose.process(rgb_image) if not results.pose_landmarks: return None, "未检测到人体" # 构建数据框 landmarks = [] for idx, landmark in enumerate(results.pose_landmarks.landmark): landmarks.append({ 'index': idx, 'name': mp_pose.PoseLandmark(idx).name, 'x': landmark.x, 'y': landmark.y, 'z': landmark.z, 'visibility': landmark.visibility }) df = pd.DataFrame(landmarks) # 临时保存为 CSV csv_path = "output_keypoints.csv" df.to_csv(csv_path, index=False) # 返回图像 + 文件路径 annotated_image = draw_skeleton(image, results.pose_landmarks.landmark) return annotated_image, csv_path # Gradio 界面 demo = gr.Interface( fn=detect_and_export, inputs=gr.Image(type="numpy"), outputs=[ gr.Image(type="numpy", label="骨骼可视化"), gr.File(label="下载关键点数据 (CSV)") ], title="AI 人体骨骼检测 & 数据导出", description="上传图片,自动检测骨骼关键点并支持导出为 CSV" ) demo.launch()

用户上传图像后,不仅能看见火柴人连线图,还能点击“下载”按钮获取结构化数据。


5. 常见问题与优化建议

5.1 常见问题解答(FAQ)

问题解决方案
导出文件为空?检查是否成功检测到人体,确认results.pose_landmarks不为None
坐标全是 0~1?这是归一化值,若需像素坐标,请乘以图像宽高
Excel 打不开?安装openpyxlpip install openpyxl
多人场景只出一人?MediaPipe 默认仅返回最显著的一人,可通过max_num_people=1控制

5.2 性能优化建议

  • 缓存模型实例:避免重复初始化Pose(),提升批量处理速度
  • 降低图像分辨率:在不影响精度前提下缩小输入尺寸(如 640x480)
  • 异步导出:Web 场景下使用后台线程生成文件,防止阻塞 UI
  • 压缩输出:大量数据时可用gzip压缩 CSV:df.to_csv('data.csv.gz', compression='gzip')

6. 总结

6.1 核心收获回顾

本文系统讲解了如何从 MediaPipe Pose 模型中提取人体骨骼关键点数据,并将其导出为结构化文件格式:

  • ✅ 掌握了 MediaPipe 关键点的数据结构与访问方式
  • ✅ 实现了单图/批量图像的关键点提取流程
  • ✅ 完成了 CSV 和 Excel 格式的自动化导出
  • ✅ 在 WebUI 中集成了“一键导出”功能,提升用户体验

这些技能特别适用于: - 运动科学中的姿态分析 - 康复训练的动作评分系统 - 动画制作的角色绑定预处理 - AI 教练系统的反馈引擎构建

6.2 下一步学习建议

  • 尝试结合 OpenPose 或 HRNet 对比精度差异
  • 将 3D 坐标导入 Blender 实现动作重建
  • 使用 LSTM 模型对时序关键点做动作分类
  • 构建私有 API 接口供其他系统调用

💡获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询