LeapMotion系统概述

转载 2015年07月09日 19:47:27

从leap motion官网的介绍文章leap motion overview中,提取出个人认为有价值的东西,做下笔记,也是分享,希望能给大家带来帮助。原文地址

https://developer.leapmotion.com/documentation/Languages/C++/Guides/Leap_Overview.html

一、坐标系统

leap motion系统使用右手笛卡尔坐标系(图1)。什么是右手坐标系呢?就是右手四指从X轴正向向Y轴正向握拳,拇指方向就是Z轴正向(图2)。记录单位为毫米,原点在设备中心。X,Z轴水平,Y轴竖直。远离屏幕Z值增大,向上Y值增大,需注意放置方向。


图一 leap motion 坐标系


图二 右手坐标系

二、动作跟踪数据

leap motion可以跟踪手,手指,和一些小工具,并以帧的形式更新跟踪数据。每一帧包括跟踪对象的列表,和描述对象动作的特征。每检测到一个对象leap motion就自动给它分配一个唯一的ID,直到对象移动出检测区域,重新进入检测区域的对象会重新分配ID。

1、帧的结构

每一个帧的实例都包括跟踪数据,手势和动作因子(factor)等。

跟踪数据列表:

  • hands手。包括所有可以检测到的
  • fingers手指。所有的
  • tools工具。所有的
  • pointables。具有指向性的物体,包括所有的手指和工具
  • gestures手势。包括以上所有对象的动作
每帧有三个pointables列表,手指、工具、pointables,包含了所有被检测到的具有指向性的物体。可以利用和手的关联性,通过手的列表找到pointables。在帧序列中跟踪一个独立物体时,可以根据ID号在下一帧中查找该物体。通过ID可以查找到跟踪数据列表里面的所有对象。如果当前帧存在查找对象,查找函数返回一个指向该对象的引用。如果对象不存在了,就返回一个不可见对象,其中不包含有效的跟踪数据。这样就可以避免每次跟踪物体时都有检查其是否存在。

leap motion通过分析当前帧动作与之前帧动作的变化,将动作翻译成平移、旋转、缩放等动作因子。例如双手都向左移动表示平移,双手做转球的动作表示旋转,双手相向移动或远离表示缩放。leap motion根据检测区域内检测到的所有对象的运动转化为动作因子。如果检测到两只手,则同时考虑两只手的动作,也可以通过单个手的实例分别获取每一只手的动作因子。

描述动作的属性包括:

  • rotation axis旋转轴 
  • rotation angle旋转角度
  • rotation matrix旋转矩阵
  • scale factor缩放系数
  • translation平移向量
通过动作因子操作物体就可以避免跟踪多帧间的手和手指。帧可以帧内动作进行估计,把它当成特定的动作,比如当缩放系数特别大的时候,就可以忽略平移和旋转。使用该估计过滤掉多余的帧可以增加程序的可用性。

2、手的模型

手模型可以提供位置、特征、动作,以及和手关联的手指、工具等信息。对手的模型leap motion API提供了尽可能多的信息,但并不是每一帧都能完全检测到这些属性。例如握拳时,手指不可见,所以手指的列表就可能为空,编码时要注意到这些情况。

leap motion并不区分左右手,hand列表也可以包含超过2只手,但是超出两只手时会影响跟踪效果。

手的属性包括:

  • palm position手掌位置,手掌中心位置距leap motion原点的距离,单位毫米
  • palm velocity手掌速度,单位mm/s
  • palm normal手掌法向量,由掌心向下指向外部,图3
  • direction方向,掌心指向手指的向量,图3
  • sphere center球心,根据手的曲线拟合出的球的球心,图4
  • sphere radius球半径,拟合球的半径,图4
方向和手掌法向量都是单位向量。


图3 法向量和方向


图4 球心与球半径

手的动作即上面提到的平移,旋转,缩放等,不再赘述。

调用函数hand::finger(),hand::tool(),hand::pointable()可以得到手指和工具的ID。

3、手指和工具的模型

leap motion靠形状识别手状物体,工具指比手更长、更细或者更直的物体(图5)。在leap motion模型中,手指和工具被抽象为pointable对象。其物理属性包括:

  • length长度。可见部分长度
  • width宽度。可见部分平均宽度
  • direction方向。物体的单位向量,例如从指根到指尖,图6
  • tip position指尖的位置。指尖相对leap motion原点的位置,单位mm
  • tip velocity指尖的速度。单位mm/s
函数Pointable::isTool()可以判断一个pointable对象是手指还是工具。


图5 工具更长,更细,更直


图6 指尖位置和方向向量

4、手势

leap motion可以识别特定的运动模式,用户可以靠这些手势发令。手势和手指、手等其他运动跟踪数据的传回方式一样,每发现一个手势就向帧中自动添加一个手势对象,可以从帧中的手势列表获取手势对象。

leap motion可以识别的运动模式包括:

  • circle画圆,一根手指画一个圆
  • swipe挥扫,手的线性运动
  • key tap击键,敲键盘一样的轻击
  • screen tap触屏,触摸垂直屏幕一样的轻击
leap motion首次识别出一个手势后将其加入帧,如果这是一个持续性动作,leap motion将一个更新的手势对象加入后续帧。画圆和挥扫是持续性动作,leap motion在每一帧中更新这些手势,tap轻击是不连续的动作,所以每次敲击只需一个手势对象。

程序中,想使用某个手势前,需要调用Controller类中的enableGesture()方法启用该手势的识别。

画圆

可以用手指和工具画圆,手势开始后leap motion会一直更新这个过程直到手势结束,手指或工具离开圆的轨道或动作过慢时视为手势结束。相关API:CircleGesture。


图7 画圆

挥扫

相关API:SwipeGesture。


图8 挥扫

击键

快速的向下敲击被视为一次击键手势。相关API:KeyTapGesture。


图9 击键

触屏

快速向前轻击被视为一次触屏手势,相关API: ScreenTapGesture。


图10 触屏

有些地方翻译的比较生硬。请指教。

Leapmotion 感悟

leapmotion的简单介绍
  • u013610563
  • u013610563
  • 2016年08月16日 14:26
  • 1168

Unity& leapmotion开发实录

Unity leapmotion开发实录(1)本系列文章将会从一个初学者的脚步去讲解unity和leapmotion协同开发的一系列问题: 基础 环境搭建 场景创建 核心组件使用 sdk使用 脚本编写...
  • admintan
  • admintan
  • 2015年11月22日 19:04
  • 8287

LeapMotion SDK开发,常用功能总结

设置设备后台获取数据: controller.setPolicyFlags(Leap::Controller::POLICY_BACKGROUND_FRAMES); onDeviceChange:...
  • bbdxf
  • bbdxf
  • 2014年11月20日 15:05
  • 3011

LEAPMOTION开发UI专题(1)

很抱歉的是,之前说的LEAP/UI框架设计可能只有两篇 因为个人时间实在是不允许 这个问题如果展开去写的话 那么说写本书都是不为过的 且因为内容修改很是杂乱 所以我第一篇文章用来介绍LEA...
  • admintan
  • admintan
  • 2016年04月06日 15:38
  • 3950

Ubuntu+LeapMotion 环境配置

Ubuntu下配置
  • zmdsjtu
  • zmdsjtu
  • 2017年06月01日 14:25
  • 984

Leap Motion概述

这是C++语言下的Leap Motion引导文章,原文地址:https://developer.leapmotion.com/documentation/Languages/C++/Guides/Le...
  • guoming0000
  • guoming0000
  • 2013年07月21日 19:12
  • 8202

[Leap Motion开发系列]理解C++应用例子

今天晚上悦读了下Leap Motion提供的官方C++例子,感觉很棒很给力!相对于微软Kinect的程序,他们的例子编码风格少许不同,十分的高效简单!对于才学编程的菜鸟来说,你要好好看下他编程的基本功...
  • guoming0000
  • guoming0000
  • 2013年08月15日 00:28
  • 6177

leapmotion之连接到控制器

使用跟踪API 如何理解和使用Leap Motion跟踪API中的主要类和函数: 1.连接到控制器 该控制器对象调解你的应用程序和Leap运动服务之间的连接。 您可以使用该一个Cont...
  • baidu_36059497
  • baidu_36059497
  • 2016年12月15日 13:26
  • 490

LeapMotion简单介绍及图形获取

之前写过一篇文章关于C#简单调用LeapMotion的,然后前两天被工作组微信平台推送了一下,发现有同学对这个并不了解,所以今天先介绍一下Leap Motion是什么,然后说一下Leap Motion...
  • u014025201
  • u014025201
  • 2017年04月20日 16:33
  • 2108

LeapMotion应用到Android Moblie移动设备上的分享

一、最近在做一个VR项目,市场上vr盒子已经满地都是,压力很大,通过几个星期的调查和思考,想将手势识别和VR盒子结合,这样就可以很方便很有biger的进行vr输入,很自然的操作各种应用和游戏,打造自己...
  • Steve6258
  • Steve6258
  • 2016年08月20日 17:08
  • 2547
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeapMotion系统概述
举报原因:
原因补充:

(最多只允许输入30个字)