Hand类(Leap::Hand)

本文详细介绍了Leap Motion手部跟踪API中的Hand类及其成员函数。Hand类用于记录检测到的手的物理特性,如手掌位置、手指指向、手势置信度等。文章还讲解了如何使用这些函数来获取手部的详细信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hand类(Leap::Hand)

Hand类记录一个检测到的手的物理特征。手的跟踪数据包括:手掌的位置和速率、包含手掌常态和手指指向的向量、适合手的一个球的属性、附着的手指的列表。需要从Frame对象中得到Hand对象,如下。注意,Hand对象也可以是无效的。可以用Hand::isValid()函数来判断有效性。
Leap::HandList hands=frame.hangs();
Leap::Hand firsthand=hands[0];
Arm arm(): 表示与这只手关联的手臂。如果手臂不完全处于视线内,要结合典型的人体结构,基于视线内的实体的属性来估计手臂的属性。
用法:Leap::Hand hand=frame.hands().frontmost();
Leap::Arm arm=hand.arm();
Matrix basis(): 表示手的方向,作为基矩阵输出。基定义如下:
xBasis小指的方向为正方向。
yBasis手的上面是正方向。
zBasis手腕的方向是正方向。
注意,因为左手是右手的镜面,如果用左手,基矩阵也是左手向的。
用法:Leap::Matrix basis=hand.basis();
Leap::Vector xBasis=basis.xBasis;
Leap::Vector yBasis=basis.yBasis;
Leap::Vector zBasis=basis.zBasis;
float confidence(): 一个给定的手势的置信度。置信度值在0到1之间。
用法:float confidence=hand.confidence();
Vector direction(): 表示由手掌位置指向手指的方向。可以用手掌的方向向量来计算手掌和水平面之间的倾斜和偏航角。
用法:float pitch=hand.direction().pitch();
float yaw=hand.direction().yaw();
Finger finger(int32_t id): 表示与这只手关联的带特有ID的Finger对象。用这个函数可以用一个ID值重新得到与这只手关联的Finger对象,这个ID值是从上一帧中得到的。如果现在没有带有那个特有ID值的手指,则会返回一个无效的Finger对象。注意,这个ID值是跨帧不变的,直到跟踪失败。如果手指的跟踪丢了之后又重新得到,则代表那个手指的新的Finger对象会带有不同的ID。
用法:Leap::Finger fingerOnHandByID=hand.finger(fingerID);
FingerList fingers(): 代表这帧中检测到的与这只手关联的Finger对象的列表,按照从大拇指到小拇指的顺序。该列表可以为空。可以用PointableList::extended()从列表中移除无法扩展的手指。
用法://hand is a Leap::Hand object
Leap::FingerList fingers=hand.fingers();
Leap::ToolList tools=hand.tools();
Frame frame(): 表示与这只手相关联的帧。
用法:Leap::Frame frameForHand=hand.frame();
float grabStrength(): 表示一个抓的手势的强度。当该值为0时代表张开的手,当一个抓的手势被识别,值逐渐变为1.
用法:float strength=hand. grabStrength();
Hand(): 构造一个Hand对象。没有初始化的hand被认为是无效的。从Frame对象中得到Hand对象。
用法:Leap::Hand leftmostHand=frame.hands().leftmost();
int32_t id(): 表示这个Hand对象分配到的独有的ID。当跟踪的手保持可见的话,则在连续帧中这个值保持不变。如果跟踪丢了(比如,一只手被另一只手遮挡,或者消失在Leap Motion的视线内),那在将来的帧中如果该软件检测到这个实体,则会分配一个新的ID。通过这个ID值和Frame::hand()函数在将来的帧中找到这个Hand对象。
用法:Leap::Hand knownHand=frame.hand(handID);
bool isLeft(): 判断这个对象是否是左手。如果被判定为左手,返回True。
用法:std::string handName=hand.isLeft() ? “Left hand” : “Right hand”;
bool isRight(): 判断这个对象是否是右手。如果被判定为右手,返回True。
bool isValid(): 判断这是否是个有效的Hand对象。如果这个对象包含有效的跟踪数据,则返回True。
bool operator!=(const Hand &): 比较Hand对象是否不相等。如果两个对象都是有效的,在同一帧中有且仅有这两个对象表示同样的实体,则这两个对象相等。
用法:thisHand!=thatHand;
bool operator==(const Hand &): 比较Hand对象是否相等。如果两个对象都是有效的,在同一帧中有且仅有这两个对象表示同样的实体,则这两个对象相等。
用法:thisHand==thatHand;
Vector palmNormal(): 表示手掌的标准向量。如果手放平,则这个向量将指向下方。或者说指向手掌正面之外。可以用这个手掌标准向量来计算手掌与水平面的侧倾角。
用法:float roll=hand.palmNormal().roll();

这里写图片描述

Vector palmPosition(): 表示Leap Motion坐标系中,以毫米为单位的手掌中心的位置。
用法:Leap::Vector handCenter=hand. palmPosition();
Vector palmVelocity(): 表示手掌位置的变化速率(毫米/秒)。返回代表手掌速率坐标的向量。
用法:Leap::Vector handSpeed=hand. palmVelocity();
float palmWidth(): 表示当手是平的,手掌的估计宽度(毫米)。
用法:float handWidth=hand. palmWidth();
float pinchStrength(): 表示一个捏的手势的保持强度。对于张开的手,这个值是0.当一个捏的手势被识别,这个值逐渐变为1.可以通过大拇指和其他手指来完成。
用法:float pinch=hand. pinchStrength();
Pointable pointable(int32_t id): 表示这只手中具有特定ID的Pointable对象。用这个函数可以用一个ID值从这只手中重新得到这个Pointable对象,这个ID值是从上一帧中得到的。这个ID值是跨帧不变的,直到跟踪失败。如果手的跟踪丢了之后又重新得到,则代表那个手的新的Pointable对象会带有不同的ID。
用法:Leap::Pointable knownPointable=hand.pointable(pointableID);
PointableList pointables(): 代表这帧中检测到的与这只手关联的Pointable对象的列表(任意顺序),这个列表总是包含5个手指。
用法:Leap::PointableList pointables=hand.pointables();
float rotationAngle(const Frame & sinceFrame): 表示在当前帧和指定帧之间,环绕由这只手以及与其相关联的手指方向上的变化产生的旋转轴的旋转角度。返回的角度是从开始帧到结束帧顺时针旋转的弧度(用右手定则),这个值总是在0到pi之间。如果这一帧或者sinceFrame是无效的Frame对象,则旋转角度是0.
用法:float rotationOfHand=hand.rotationAngle(startFrame);
float rotationAngle(const Frame & sinceFrame,const Vector & axis): 表示在当前帧和指定帧之间,环绕由这只手以及与其相关联的手指方向上的变化产生的指定的旋转轴的旋转角度。返回的角度是从开始帧到结束帧顺时针旋转的弧度(用右手定则),这个值总是在0到pi之间。如果这一帧或者sinceFrame是无效的Frame对象,则旋转角度是0.
用法:float rotationAroundYAxis=hand.rotationAngle(startFrame,Leap::Vector::yAxis());
Vector rotationAxis(const Frame & sinceFrame): 表示环绕从当前帧到指定帧整体旋转运动中形成的旋转轴。返回的方向向量是归一化的。
用法:参数sinceFrame是计算相对旋转的开始帧。
Leap::Vector axisOfHandRotation=hand. rotationAxis(startFrame);
Matrix rotationMatrix(const Frame & sinceFrame): 描述从当前帧到指定帧这只手和与其关联的手指方向上的变化产生的旋转运动的转换矩阵。
用法:参数sinceFrame是计算相对旋转的开始帧。
Leap::Matrix handRotationTransform=hand. rotationMatrix(startFrame);
float rotationProbability(const Frame & sinceFrame): 从当前帧到指定帧手的运动被认为是一种旋转运动的概率。
用法:参数sinceFrame是计算相对旋转的开始帧。
float rotationIntentFactor=hand. rotationProbability (startFrame);
float scaleFactor(const Frame & sinceFrame): 表示从当前帧到指定帧手的运动中的缩放因子。缩放因子总是正的,值1表示没有发生尺度变化,0到1之间表示收缩,大于1表示放大。
用法:参数sinceFrame是计算相对尺度的开始帧。
float handScaleFactor=hand. scaleFactor (startFrame);
float scaleProbability(const Frame & sinceFrame): 从当前帧到指定帧手的运动被认为是一种尺度运动的概率。
用法:参数sinceFrame是计算相对尺度的开始帧。
float scaleIntentFactor=hand. scaleProbability (startFrame);
Vector sphereCenter(): 表示符合手的曲率的一个球的球心(假设手里握着一个球)。返回一个向量代表这个球心的位置。
用法:Leap::Vector sphereCenter=hand. sphereCenter();
float sphereRadius(): 表示这个球的半径。当手蜷缩成一个拳头,这个球的大小会减小。
用法:float sphereDiameter=2*hand. sphereRadius();

这里写图片描述

Vector stabilizedPalmPosition(): 表示这个手对象稳定的手掌位置。这个位置会落后于手掌位置一个不等的量,主要依靠移动的速率。返回的是这个Hand对象修正的手掌位置,其中会有一些额外的平滑和稳定。
用法:Leap::Vector filteredHandPosition=hand. stabilizedPalmPosition();
float timeVisible(): 表示这个对象在Leap Motion控制器中保持可视化的时间(秒)。
用法:float lifetimeOfThisHandObject=hand.timeVisible();
Tool tool(int32_t id): 在版本2.0之后,工具对象都与手不关联,所以这个函数总是返回一个无效的Tool对象。
ToolList tools(): 在版本2.0之后,工具对象都与手不关联,所以这个列表总为空。
std::string toString(): 一个包含简略描述该Hand对象的字符串。
Vector translation(const Frame & sinceFrame): 表示当前帧和指定帧之间这只手位置的变化。返回的平移向量提供了移动的大小和方向(毫米为单位)。
用法:Leap::Vector linearHandMovement=hand.translation(startFrame);
float translationProbability(const Frame & sinceFrame): 从当前帧到指定帧手的运动被认为是一种平移运动的概率。
用法:float translationIntentFactor=hand. translationProbability (startFrame);
Vector wristPosition(): 表示这只手的手腕的位置。
const Hand & invalid(): 返回一个无效Hand对象。还是用来判断对象是否有效。

引自:https://developer.leapmotion.com/documentation/cpp/api/Leap.Hand.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值