Leap Motion 开发笔记
Leap Motion 体系架构
Leap Motion支持所有主流操作系统,leap motion在Windows系统下是作为一个服务运行的,在Mac和Linux是后台守护进程。软件通过USB线连接Leap Motion。
使用Leap的程序通过访问后台的服务进程获取相关数据。
LM提供了两种方式获取数据:1、本机地接口(Native interface)2、WebSocket接口。
注:LM服务使用TCP接口 127.0.0.1:5905,WebSocket使用127.0.0.1:6437端口,此端口不可以被占用或被防火墙拦截。
使用C++开发LM程序
编译器选择:
Visual Studio 2008, 2010, or 2012
· LeapSDK/sample/Sample.cpp— C++ sample application
· LeapSDK/include/Leap.h— Leap C++ API class and struct definitions
· LeapSDK/include/LeapMath.h— Leap C++ API Vector and Matrix class and struct definitions
· LeapSDK/lib/x86/Leap.lib— 32-bit Leap compile-time library for Windows
· LeapSDK/lib/x64/Leap.lib— 64-bit Leap compile-time library for Windows
· LeapSDK/lib/x86/Leap.dll— 32-bit Leap runtime library for Windows
· LeapSDK/lib/x64/Leap.dll— 64-bit Leap runtime library for Windows
· LeapSDK/lib/x86/Leapd.lib— 32-bit Leap compile-time debug library for Windows
· LeapSDK/lib/x64/Leapd.lib— 64-bit Leap compile-time debug library for Windows
· LeapSDK/lib/x86/Leapd.dll— 32-bit Leap runtime debug library for Windows
· LeapSDK/lib/x64/Leapd.dll— 64-bit Leap runtime debug library for Windows
常用类库的说明:
· Leap::Controller— 应用程序和Leap服务之间的接口
· Leap::Listener— 用来接收从Leap发来的数据
· Leap::Frame— 包含一帧手和手指被跟踪的数据
· Leap::Hand— 包含一个检测到的手的跟踪数据
· Leap::Finger— 包含检测到的手指的跟踪数据
· Leap::Vector— 代表了一个3D位置或方向向量
· Leap::Gesture— 代表一个识别的手势
Leap官方的SDK有一点很值得称道,SDK封装的非常好,如上面所述,我们只需要创建一个Controller对象,皆可以通过它获取和设置所有LM相关的信息。
通过Controller获取数据有两种方式,一种为Listener, 还有一种为Frame, 我把它归结为主动式和被动式。
被动式:通过 addListener (Listener &listener) 函数添加一个listener, 在listener中重载各个虚函数,这样leap服务会在适当的时候调用对应的虚函数(回调),我们就被动地接收到了数据,当然也包括各种设置也可以在这里进行。优点是每一帧数据都会得到处理,缺点是太浪费内存和CPU。
主动式:通过frame (int history=0) 主动查询当前帧的状态,当需要时调用。优点很明显,获取数据主动权在我们手中,什么时候要什么时候调用,自主分配处理负荷,省事省力。缺点就是不能实时处理每一帧。
官方给出的Sample中,使用的是第一种方式,创建Listener,解析每一帧的数据。核心代码如下:
Controller controller;
SampleListener LeapLister; // 创建继承于Listener的类,重载onInit,onConnect,onFrame等函数
controller.addListener(SampleListener); // 程序会在这里内部一直循环,直到leap服务退出或断开
controller.removeListener(SampleListener);
在SampleListener 类中,当有Frame数据到达时,leap会通知OnFrame函数,通过Controller对象查询相关数据。const Frame frame = controller.frame();
Frame是所有处理中的重头戏,通过frame.hands()获得所有的手信息,frame.gestures()获得手势信息,frame.fingers()获取手指头的信息,frame.id()当前帧的ID等。
设置识别的手势:(目前总共只能识别这几种手势)
controller.enableGesture(Gesture::TYPE_CIRCLE);
controller.enableGesture(Gesture::TYPE_KEY_TAP);
controller.enableGesture(Gesture::TYPE_SCREEN_TAP);
controller.enableGesture(Gesture::TYPE_SWIPE);
手势识别和控制部分:
const GestureList gestures = frame.gestures();
for (int g = 0; g < gestures.count(); ++g) {
Gesture gesture = gestures[g];
switch (gesture.type()) {
case Gesture::TYPE_CIRCLE: ...
case Gesture::TYPE_SWIPE: ...
case Gesture::TYPE_KEY_TAP: ...
case Gesture::TYPE_SCREEN_TAP: ....
}
}
画圆的检测判定:
CircleGesture circle = gesture;
std::string clockwiseness;
if (circle.pointable().direction().angleTo(circle.normal()) <= PI/4) {
clockwiseness = "顺时针";
} else {
clockwiseness = "逆时针";
}
// 计算之前的某一帧到现在之间产生的角度
float sweptAngle = 0;
if (circle.state() != Gesture::STATE_START) { // 也可以直接判断STATE_STOP
CircleGesture previousUpdate = CircleGesture(controller.frame(5).gesture(circle.id())); // 缓冲区中的第五帧
sweptAngle = (circle.progress() - previousUpdate.progress()) * 360; // .progress()获取到的float类型的圈数
}
if ( sweptAngle > 360)
{
}
break;
// 未完,待续
Leap Motion 开发笔记的更多相关文章
- Qt 加载Leap motion 手势识别软件 二次开发 hello world
研发需要对收拾是被进行精确定位,实现收拾的识别,和在虚拟现实中精确的显示手势在实际世界中的位置. 开始使用的Qt mingw的版本开发,总是函数没有定义,最后发现是leap sdk中需要代育vs的库文 ...
- Leap Motion发布新平台,直击下一代移动端VR/AR手部追踪
2013年,动作捕捉技术公司Leap Motion发布了面向PC的体感控制器,不过销量并不乐观.随着2014年虚拟现实技术的再一次兴起,它发布一款用于Oculus Rift的附加设备,从而正式登上VR ...
- Unity3D中使用Leap Motion进行手势控制
Leap Motion作为一款手势识别设备,相比于Kniect,长处在于准确度. 在我的毕业设计<场景漫游器>的开发中.Leap Motion的手势控制作为重要的一个环节.以此,谈谈开发中 ...
- 基于unity3d和leap motion的拼图游戏
近期用unity3d引擎做了一个拼图游戏,会分几次写完,以此作为总结. 本文基本查找了网上能查到的全部资料作为參考.也算是大家节省了时间. 眼下仅仅完毕了拼图部分,leap motion手势控制部分会 ...
- 十大最佳Leap Motion体感控制器应用
十大最佳Leap Motion体感控制器应用 Leap Motion Controller也许还没有准备好大规模的发售,但是毫无疑问,这款小巧的动作捕捉器是我们见过的最酷的设备之一.这款设备的硬件 ...
- Leap Motion颠覆操控体验的超精致手势追踪技术【转】
转自:http://www.cnblogs.com/emouse/archive/2013/02/28/2936689.html 先来看两段简介视频: 看了介绍视频后,对如此次超高精度的手势追踪非常好 ...
- [开发笔记]-未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService...匹配的导出【转载自:酷小孩】
原文地址:http://www.cnblogs.com/babycool/p/3199158.html 今天打算用VisualStudio2012做一个js效果页面测试的时候,打开VS2012新建项目 ...
- EasyUI 开发笔记(二)
接上篇 :EasyUI 开发笔记(一) (http://www.cnblogs.com/yiayi/p/3485258.html) 这期就简单介绍下, easyui 的 list 展示, 在easy ...
- EasyUI 开发笔记(一)
由于某些原因,在公司做的后台需要改成类似于Ext.js 形式的后台,主要看好其中的 框架布局,以及tab开页面和弹出式内部窗体. 后来看看,改成EasyUI,较Ext.js 库小很多,也便于公司的初级 ...
随机推荐
- 3143: [Hnoi2013]游走 - BZOJ
Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点, ...
- SVN--从本地检出项目至服务器报错--禁止访问
错误描述: 原因:这是访问权限限制引起的. 查看/svn/test目录的权限--之前我修改过的 现在添加一个user就好了--这个添加的developer是我之前导入本地项目时已经验证过的,所以再导入 ...
- SQL SERVER字符串函数
本篇文章还是学习<程序员的SQL金典>内容的记录,此次将讲解的是SQL SERVER的字符串函数. 其实数据库跟程序语言库一样,都会集成很多可以使用的API.这些API,如果你熟悉的话,将 ...
- 【转】并查集&MST题集
转自:http://blog.csdn.net/shahdza/article/details/7779230 [HDU]1213 How Many Tables 基础并查集★1272 小希的迷宫 基 ...
- nenu contest
http://vjudge.net/vjudge/contest/view.action?cid=54393#overview A n^2能过 对第二个n我二分了一下,快了一点点,nlogn #inc ...
- uva 11609
可以想到 答案为 1*C(1,n)+2*C(2,n)+3*C(3,n)+....+n*C(n,n); 由公式 k*C(k,n) = n*C(k-1,n-1) 所以最终答案 n*2^(n-1) 用到快速 ...
- 如何实现Windows Phone代码与Unity相互通信(事件方式)
源地址:http://www.cnblogs.com/petto/p/3909063.html 一些废话 昨天写一篇今天写一篇.不是我闲的蛋疼,是今天一天碰到了好几个恼人的问题,浪费一天时间搞定.本文 ...
- POJ 3125 Printer Queue(队列,水题)
题意:有多组数据,每组数据给出n,m,n表示需要打印的文件个数,m表示要打印的目标位置(m为0~n-1). 接下来给出n个数,第i个值对应第i-1个位置的优先级大小. 打印规则如下: ...
- Ubuntu环境下Hadoop1.2.1, HBase0.94.25, nutch2.2.1各个配置文件一览
/×××××××××××××××××××××××××××××××××××××××××/ Author:xxx0624 HomePage:http://www.cnblogs.com/xxx0624/ ...
- Oracle的学习一:安装与卸载、sql *plus常用命令、Oracle用户管理
1.为什么学习oracle? 性能优越: 小型数据库 中型数据库 大型数据库 acess.foxbase mysql.sql server.informix sybase.oracle.db2 复杂量 ...