如何使用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
相关产品推荐
相关产品推荐

