You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MediaPipe能否实时渲染增强关键点?如何适配draw_landmarks函数

解决MediaPipe实时渲染增强后关键点的方法

要实时查看增强后的关键点,核心是把处理后的numpy数组转换成MediaPipe原生的NormalizedLandmarkList和NormalizedLandmark对象——因为draw_landmarks()只认这个格式,不认numpy数组或普通字典。具体步骤如下:

1. 导入必要的MediaPipe protobuf模块

首先要引入MediaPipe定义关键点结构的模块:

import mediapipe as mp
from mediapipe.framework.formats import landmark_pb2
import numpy as np

2. 将增强后的numpy数组还原为关键点结构

假设你已经得到了增强后的扁平化数组lh_arr,按以下步骤转换:

  • 先把扁平化数组恢复成(关键点数量, 3)的三维坐标形状(左手关键点共21个,所以是(21,3))
  • 逐个创建NormalizedLandmark对象,赋值x/y/z坐标
  • 把所有Landmark对象打包成NormalizedLandmarkList

代码示例:

# 恢复增强后数组的形状:从扁平化转为(21,3)的坐标数组
enhanced_lh_coords = lh_arr.reshape(21, 3)

# 创建空的NormalizedLandmarkList对象
enhanced_lh_landmarks = landmark_pb2.NormalizedLandmarkList()

# 遍历每个坐标,生成Landmark对象并添加到列表中
for x, y, z in enhanced_lh_coords:
    landmark = landmark_pb2.NormalizedLandmark()
    landmark.x = x
    landmark.y = y
    landmark.z = z
    enhanced_lh_landmarks.landmark.append(landmark)

3. 替换原results中的关键点并渲染

把转换好的NormalizedLandmarkList对象赋值给results的对应属性,之后就能正常调用draw_landmarks()渲染了:

# 替换results里的左手关键点数据
results.left_hand_landmarks = enhanced_lh_landmarks

# 实时渲染增强后的关键点
mp.solutions.drawing_utils.draw_landmarks(
    image,  # 你的输入帧图像
    results.left_hand_landmarks,
    mp.solutions.holistic.HAND_CONNECTIONS  # 手部关键点的连接关系
)

注意事项

  • 不同部位的关键点数量不同:人体33个、面部468个、单只手21个,恢复形状时要对应正确的数量
  • 增强后的坐标尽量保持在合理范围(NormalizedLandmark的x/y默认是0-1,对应画面的宽高比例,超出的话关键点会跑到画面外)

内容的提问来源于stack exchange,提问作者BurmanJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 18:05:29