转自:https://blog.csdn.net/zmdsjtu/article/details/52668345
转自:https://blog.csdn.net/zmdsjtu/article/details/52669422
官方C++ SDK介绍地址:
本文是就着英文版官方说明给出了翻译以及自己的理解,Hand模块总共分为了两块,上文完成一半,下午把另一半发上来。
目录概览:
· Hand()
· arm() const
· basis() const
· confidence() const
· direction() const
· finger(int32_t id) const
· fingers() const
· frame() const
· grabAngle() const
· grabStrength() const
· id() const
· invalid()
· isLeft() const
· isRight() const
· isValid() const
· operator!=(const Hand &) const
· operator==(const Hand &) const
· palmNormal() const
· palmPosition() const
· palmVelocity() const
· palmWidth() const
详细解释:
class Leap::Hand
获取一个手的对象:
Leap::HandList hands = frame.hands();
Leap::Hand firstHand =hands[0];
备注:hand()出来的可能是无效对象,当检测不出手的时候会拟合出一个,故而可以用用手isvalid()功能来判定是否是有效的。
Since
1.0
Hand()
创造一个Hand object.//从Frame对象里获取有效Hand对象
Leap::HandleftmostHand = frame.hands().leftmost();
Since
1.0
Arm arm() const
返回定义的Arm类型的参数,如果看不到胳膊就根据人体解剖学估计出一个(估计是吹逼的,效果并没有那么好,233,实测性能并不好,但勉强可以用)
Leap::Handhand = frame.hands().frontmost();
Since
2.0.3
Matrix basis() const
以矩阵的形式返回hand的方向信息//左右手呈镜面关系
xAxis 小拇指的正方向
yAxis 手面向上的正方向
zAxis 手腕朝向的正方向
Leap::Matrixbasis = hand.basis();
Leap::VectorxBasis = basis.xBasis;
Leap::VectoryBasis = basis.yBasis;
Leap::VectorzBasis = basis.zBasis;
Since
2.0
float confidence() const
对一个手部姿态的确信程度(看来并不是无脑自信,哈哈哈)
float confidence= hand.confidence();
Since
2.0
Vector direction() const
返回手掌朝向的Vector,分为pitch,yaw和row。
float pitch = hand.direction().pitch();
float yaw = hand.direction().yaw();
float roll = hand.palmNormal().roll();
Since
1.0
Finger finger(int32_t id) const
从前一Frame里返回Finger类型的指定编号的手指对象,如果没有会返回一个invalid的Finger对象
Leap::Finger fingerOnHandByID = hand.finger(fingerID);
Since
1.0
FingerList fingers() const
返回这个hand里所有的Finger对象并储存在FingerList里。
备注:用 PointableList::extended() 可以去除列表里non-extended的finger对象
// hand is a Leap::Hand object
Leap::PointableListpointables= hand.pointables();// Both fingers and tools
Leap::FingerListfingers = hand.fingers();
Since
1.0
Frame frame() const
返回和Hand相关的Frame。如果不可获得就返回invalid类型的Frame对象
Leap::FrameframeForHand = hand.frame();
Since
1.0
float grabAngle() const
返回手掌抓握的紧张程度,数值在0-π之间,紧握为0,松开为π
//本质上其实就是算的四根手指的平均张开角度
Since
3.0
float grabStrength() const
落伍了落伍了!!废弃不用了。。。
用 grabAngle() 替代。
Since
2.0
int32_t id() const
和Hand对象绑定的ID,就算手消失了还是存在的
(然而它并没有Kinect那种消失再回来还能一定程度上匹配的功能,至少我测试的没有,甚至同一只手没超出范围还会跳变,摔墙!)
//下面代码用于发现未来一些frame里已知ID的手的甄别
Leap::HandknownHand = frame.hand(handID);
Since
1.0
bool isLeft() const
判断手是不是左手。。。
std::string handName = hand.isLeft()? "Left hand" : "Right hand";
Since
2.0
bool isRight() const
判断是不是右手
if(hand.isRight()){
// .. Do righthanded stuff
}
Since
2.0
bool isValid() const
判断手对象里的数据是不是有效的鲁棒的。
if (hand.isValid()){
//Process handdata...
}
Since
1.0
bool operator!=(const Hand &) const
比较两个Hand对象是不是同一Frame同一个手(估计是比较手的长短啊大小啊位置啊之类的)//黑人问号脸:我要这个何用???
thisHand != thatHand;
Since
1.0
bool operator==(const Hand &) const
和上面的类似
thisHand == thatHand;
Since
1.0
Vector palmNormal() const
指向手掌的Vector,搭配direction食用风味更佳
float pitch = hand.direction().pitch();
float yaw = hand.direction().yaw();
float roll = hand.palmNormal().roll();
Since
1.0
Vector palmPosition() const
返回手腕重心点在LeapMotion坐标系里毫米单位的坐标
Leap::VectorhandCenter = hand.palmPosition();
Since
1.0
Vector palmVelocity() const
返回手掌的移动速度,单位:millimeters/second.
Leap::VectorhandSpeed = hand.palmVelocity();
Since
1.0
float palmWidth() const
当手面平整时估计手掌的宽度。单位是毫米
float handWidth = hand.palmWidth();
Since
2.0
第一部分先到这里了,剩下的下午翻译完再发。
官方C++ SDK介绍地址:
本文是就着英文版官方说明给出了翻译以及自己的理解,Hand模块总共分为了两块,这里为下篇。
目录概览:
· rotationAngle(constFrame &sinceFrame) const
· rotationAngle(constFrame &sinceFrame, const Vector &axis) const
· rotationAxis(constFrame &sinceFrame) const
· rotationMatrix(constFrame &sinceFrame) const
· rotationProbability(constFrame &sinceFrame) const
· scaleFactor(constFrame &sinceFrame) const
· scaleProbability(constFrame &sinceFrame) const
· stabilizedPalmPosition()const
· translation(constFrame &sinceFrame) const
· translationProbability(constFrame &sinceFrame) const
详细解释:
float pinchDistance() const
大拇指和食指的距离。单位:毫米。
Since
3.0
float pinchStrength() const
废弃!
用 pinchDistance() 替代
Since
2.0
Pointable pointable(int32_t id) const
返回Hand对应ID的Pointable对象
Leap::PointableknownPointable = hand.pointable(pointableID);
Since
1.0
PointableList pointables() const
返回Potintable组成的一个列表(其实就是五根手指组成的).
// hand is a Leap::Hand object
Leap::PointableListpointables = hand.pointables();// Both fingers and tools
Leap::FingerListfingers = hand.fingers();
Since
1.0
float rotationAngle(const Frame & sinceFrame) const
返回和startFrame那一帧相比,手的相对旋转
float rotationOfHand = hand.rotationAngle(startFrame);
float rotationAngle(const Frame & sinceFrame,const Vector & axis) const
返回和sinceFrame那一帧相比,绕axis的相对旋转的角度
float rotationAroundYAxis = hand.rotationAngle(startFrame,Leap::Vector::yAxis());
Vector rotationAxis(const Frame & sinceFrame) const
返回当前和sinceFrame那一帧相比,启发式(heuristically)确定的绕着旋转的轴的Vector
Leap::VectoraxisOfHandRotation = hand.rotationAxis(startFrame);
Matrix rotationMatrix(const Frame & sinceFrame) const
返回和SinceFrame相比的变换矩阵,Matrix类型。
Leap::MatrixhandRotationTransform = hand.rotationMatrix(startFrame);
float rotationProbability(const Frame & sinceFrame) const
与sinceFrame相比,当前帧为旋转移动成的可能性,返回一个0-1的float。
float rotationIntentFactor = hand.rotationProbability(startFrame);
float scaleFactor(const Frame & sinceFrame) const
返回当前和指定帧的缩放比例
float handScaleMotion = hand.scaleFactor(startFrame);
float scaleProbability(const Frame & sinceFrame) const
返回两帧之间是缩放运动的可能性,数值为0-1的float。
float scaleIntentFactor = hand.scaleProbability(startFrame);
Vector sphereCenter() const
返回手掌抓取球的模型中球的球心位置坐标。
Leap::VectorsphereCenter= hand.sphereCenter();
Since
1.0
float sphereRadius() const
返回上述模型中的球的半径(就是假装握着球,这球有多大,233),单位为毫米
float sphereDiameter = 2 * hand.sphereRadius();
Since
1.0
Vector stabilizedPalmPosition() const
经过平滑处理以及一系列其他处理之后的手掌的位置坐标,返回值为Vector
//可靠性和手运动的速度有关,如果速度过快可能会有滞后感
Leap::VectorfilteredHandPosition = hand.stabilizedPalmPosition();
Since
1.0
float timeVisible() const
返回这个hand被追踪的时间,单位是秒
float lifetimeOfThisHandObject = hand.timeVisible();
Since
1.0
std::string toString() const
把hand的信息转化为方便阅读与显示的string类型。
Since
1.0
Vector translation(const Frame & sinceFrame) const
返回前后两帧平移运动位置变化的Vector。
Leap::VectorlinearHandMovement = hand.translation(startFrame);
float translationProbability(const Frame & sinceFrame) const
返回前后两帧为平移运动的可能性质,大小为0-1的float。
float translationIntentFactor = hand.translationProbability(startFrame);
Vector wristPosition() const
返回腕部以毫米为单位的坐标的Vector。
Since
2.0.3
补充两点:
Public Static Functions
const Hand & invalid()
返回invalid的Hand
if (hand !=Leap::Hand::invalid()){
//Process handdata...
}
Since
1.0
Friends
friendstd::ostream & operator<<
输出方便阅读的Hand对象
std::cout << hand << std::endl;
Since
1.0