之前上《人机交互》的课程的时候接触到了Leap Motion,后来入手了一个,一开始只是玩玩里面的小应用,后来就尝试着自己写个小样例,然后搜相关的文档,感觉写的都很乱(应该是小弟理解有问题),而且动不动就要配置环境变量什么的,个人不喜欢那样的,因为配置了环境变量换个电脑还要配置,但是直接放在bin目录就省事了,而且关于C#的文档也很少,所以这两天有时间打算把之前搭建过程什么的写写。
首先要下载Leap Motion SDK,官网地址:https://developer.leapmotion.com,有的人可能找不到或者像我一开始似的下载错SDK,大家可以在底下留言我发给大家
解压压缩包后会有三个文件:
第一个文件里面包含我们需要的类库、文档、样例代码等,那个回来说,先把中间那个exe文件安装一下,这个是对Leap Motion的一个管理软件,安装好以后会在右下角出现一个这样的图标,如果没有插入Leap Motion设备会显示黑色,有设备表面污染时会显示黄色。双击后会出现下面管理页面,这里可以先默认这样(当然“允许后台应用程序”的勾需要勾上之类的就不需要我说了吧)。
接下来新建一个C#程序,在项目的属性->生成->平台 中查看自己项目的运行平台是什么,我这里用的版本是.net4.0,平台是X86,所以引入LeapSDK\lib文件夹下的LeapCSharp.NET4.0.dll(3.5的引入相应的dll即可),同时将LeapSDK\lib\x86文件夹中的Leap.dll、Leap.lib、LeapCSharp.dll三个文件放在项目的Debug文件夹中。
这里简单介绍一下LeapSDK中的文件
docs中是对Leap Motion的一个开发文档,包括C++、C#、java、js(对Leap Motion还有js接口,挺好玩的)、python、unity等语言。
include文件中是C++的头文件。
lib是Leap提供的的dll库。
samples是C++、js、python、java的样例代码(是的,没有C#的源码),项目可以直接用vs打开,但是我打开发现有的包是没有导入的会出错,需要重新导入,除此以外两个.html文件可以直接用浏览器打开,如果你的Leap Motion控制器打开着,并且设备也连接着,你会发现这俩.html文件就能显示很多参数,这就是js通过web Socket获取的。
util里面也是一些源码文件。
下面的两个txt,version.txt是版本文件,head_sha.txt就不知道是什么东西了,只是一串编码,不知道什么用(如果知道对有什么用的话,请告诉我一下)。
然后在程序主函数页面添加下面两句,运行即可
有的人通过配置环境变量实现时,运行的时候出现了错误如下就是因为环境变量配置错误,没有找到Leap.dll、Leap.lib、LeapCSharp.dll这三个文件,可以直接将三个文件放在Debug文件夹中即可。
int main(int argc, char** argv) {
// Create a sample listener and controller
SampleListener listener;
Controller controller;
// Have the sample listener receive events from the controller
controller.addListener(listener);
if (argc > 1 && strcmp(argv[1], "--bg") == 0)
controller.setPolicy(Leap::Controller::POLICY_BACKGROUND_FRAMES);
// Keep this process running until Enter is pressed
std::cout << "Press Enter to quit..." << std::endl;
std::cin.get();
// Remove the sample listener when done
controller.removeListener(listener);
return 0;
}
大家可以直接看一下这个C++的样例程序会发现main函数里面有controller.addListener(listener),这个listener对象就是用来监听Leap Motion的一些参数。
所以我们接下来新建一个类MyListener继承类Leap.Listener这个类,点开这个Listener类会发现里面有如下函数
这里面主要是这些虚函数,我们通过重构这些虚函数来实现对Leap Motion数据的获取,而Controller类型的参数中包含着Leap Motion的手、指的坐标等属性参数,下面先简单介绍一下这些虚函数:
OnConnect:连接时触发该函数(这里的连接是指连接硬件设备,与下面的onServiceConnect做区别);
OnDeviceChange:检查到设备有变化时触发;
OnDisconnect:解除连接时触发该函数(这里的接触连接是指接触连接硬件设备,与下面的onServiceConnect做区别);
OnDeviceChange:检查到设备有变化时触发;
OnExit:退出时触发;
OnFocusGained:检测到焦点时触发(后面大家会发现当该软件到焦点找不到,即运行时点击了别的应用后,该Listener中的函数会停止运行);
OnFocusLost:找不到焦点时触发;
OnFrame:每一帧的时候调用,这个函数非常重要,以后我们写的很多判断都是在这个函数触发的时候,就是每执行一帧就会获取一组手的属性参数;
OnImages:每一次获取图像时调用,Leap Motion中有两个可见光摄像头,类似人的双眼,这个函数即获取其参数;
OnInit:初始化的时候调用该事件;
OnServiceConnect:连接时触发该函数(这里连接是指连接Leap Motion Server软件);
OnServiceDisconnect:断开连接时触发该函数(这里断开连接是指断开连接Leap Motion Server软件)。
数据传输过程
样例代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Leap;
namespace LeapDemo
{
public class MyListen:Listener
{
public override void OnConnect(Controller arg0)
{
Console.WriteLine("OnConnect");
}
public override void OnDeviceChange(Controller arg0)
{
Console.WriteLine("OnDeviceChange");
}
public override void OnDisconnect(Controller arg0)
{
Console.WriteLine("OnDisconnect");
}
public override void OnExit(Controller arg0)
{
Console.WriteLine("OnExit");
}
public override void OnFocusGained(Controller arg0)
{
Console.WriteLine("OnFocusGained");
}
public override void OnFocusLost(Controller arg0)
{
Console.WriteLine("OnFocusLost");
}
public override void OnFrame(Controller arg0)
{
Frame f = arg0.Frame();//每一帧的具体数据
HandList hands = f.Hands;
Console.WriteLine("当前有"+hands.Count+"只手");
}
public override void OnImages(Controller arg0)
{
//这里的图片获取函数不会触发,在OnFrame的参数里面也获取不到image照片,
//如果想获取照片加上 myController.SetPolicy(Controller.PolicyFlag.POLICY_IMAGES);
//下节会具体说
Console.WriteLine("OnImages");
}
public override void OnInit(Controller arg0)
{
Console.WriteLine("OnInit");
}
public override void OnServiceConnect(Controller arg0)
{
Console.WriteLine("OnServiceConnect");
}
public override void OnServiceDisconnect(Controller arg0)
{
Console.WriteLine("OnServiceDisconnect");
}
}
}