Leap Motion开发环境搭建及简单样例

Leap Motion简介

之前上《人机交互》的课程的时候接触到了Leap Motion,后来入手了一个,一开始只是玩玩里面的小应用,后来就尝试着自己写个小样例,然后搜相关的文档,感觉写的都很乱(应该是小弟理解有问题),而且动不动就要配置环境变量什么的,个人不喜欢那样的,因为配置了环境变量换个电脑还要配置,但是直接放在bin目录就省事了,而且关于C#的文档也很少,所以这两天有时间打算把之前搭建过程什么的写写。

环境搭建

首先要下载Leap Motion SDK,官网地址:https://developer.leapmotion.com,有的人可能找不到或者像我一开始似的下载错SDK,大家可以在底下留言我发给大家

解压压缩包后会有三个文件:

Leap Motion开发环境搭建及简单样例_第1张图片

第一个文件里面包含我们需要的类库、文档、样例代码等,那个回来说,先把中间那个exe文件安装一下,这个是对Leap Motion的一个管理软件,安装好以后会在右下角出现一个这样的图标,如果没有插入Leap Motion设备会显示黑色,有设备表面污染时会显示黄色。双击后会出现下面管理页面,这里可以先默认这样(当然“允许后台应用程序”的勾需要勾上之类的就不需要我说了吧)。

Leap Motion开发环境搭建及简单样例_第2张图片

接下来新建一个C#程序,在项目的属性->生成->平台 中查看自己项目的运行平台是什么,我这里用的版本是.net4.0,平台是X86,所以引入LeapSDK\lib文件夹下的LeapCSharp.NET4.0.dll(3.5的引入相应的dll即可),同时将LeapSDK\lib\x86文件夹中的Leap.dll、Leap.lib、LeapCSharp.dll三个文件放在项目的Debug文件夹中。

这里简单介绍一下LeapSDK中的文件

Leap Motion开发环境搭建及简单样例_第3张图片

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 Motion开发环境搭建及简单样例_第4张图片

有的人通过配置环境变量实现时,运行的时候出现了错误如下就是因为环境变量配置错误,没有找到Leap.dll、Leap.lib、LeapCSharp.dll这三个文件,可以直接将三个文件放在Debug文件夹中即可。

Leap Motion开发环境搭建及简单样例_第5张图片

Demo

SDK C++样例
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开发环境搭建及简单样例_第6张图片

这里面主要是这些虚函数,我们通过重构这些虚函数来实现对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软件)。

数据传输过程

Leap Motion开发环境搭建及简单样例_第7张图片


样例代码

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");
        }
    }
}

这里的Demo我已经上传到我的CSDN上面了,大家也可以去下载运行。




你可能感兴趣的:(Leap,Motion)