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

如何使用TensorFlow.js的handpose模型识别左右手

基于landmark手动区分左右手的实现方法

你已经完成的手掌正反面判断可以直接作为手性判断的前置条件,利用手部关键点的镜像不对称特性即可实现区分,逻辑不受手掌朝向影响:

  • 固定选取3个不受手指动作干扰的基准点:手腕点(landmark索引0)、食指根部点(landmark索引5)、小指根部点(landmark索引17)
  • 用三个点计算参考平面的法向量:先计算向量A = 食指根部坐标 - 手腕坐标、向量B = 小指根部坐标 - 手腕坐标,对两个向量做叉乘得到平面法向量
  • 结合正反面判断结果做分类:
    • 手心朝向镜头时,法向量Z分量为正对应右手,为负对应左手
    • 手背朝向镜头时,法向量Z分量为正对应左手,为负对应右手

简单的JS实现参考:

// points:模型返回的21个手部关键点数组,每个元素格式为[x, y, z]
// isPalmFacingCamera:你已经实现的手掌正反面判断结果,布尔值
function getHandType(points, isPalmFacingCamera) {
  const [wrist, indexBase, pinkyBase] = [points[0], points[5], points[17]];
  // 计算两个基准向量
  const vecA = [
    indexBase[0] - wrist[0],
    indexBase[1] - wrist[1],
    indexBase[2] - wrist[2]
  ];
  const vecB = [
    pinkyBase[0] - wrist[0],
    pinkyBase[1] - wrist[1],
    pinkyBase[2] - wrist[2]
  ];
  // 叉乘取Z分量即可,XY分量不影响分类结果
  const crossZ = vecA[0] * vecB[1] - vecA[1] * vecB[0];
  return isPalmFacingCamera 
    ? (crossZ > 0 ? 'Right' : 'Left')
    : (crossZ > 0 ? 'Left' : 'Right');
}

TFJS版handpose的原生左右手支持

官方的@tensorflow-models/hand-pose-detection包已经内置了左右手分类能力,不需要自行实现上述逻辑:

  • 0.4.0及以上版本调用estimateHands接口时,返回的每只手识别结果中会自带handedness字段,值为Left或Right,对应的分类置信度存放在handednessConfidence字段
  • 如果你使用的是旧版本包,直接升级到最新正式版即可调用原生能力,不需要改动原有识别逻辑
  • 若不方便升级包,用上述手动判断逻辑即可,运算量极低,不会增加明显的推理耗时

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:27:03