Leap Motion開發環境搭建及簡單樣例

Leap Motion簡介

之前上《人機交互》的課程的時候接觸到了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文件夾中即可。

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數據的獲取,而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");
        }
    }
}

這裏的Demo我已經上傳到我的CSDN上面了,大家也可以去下載運行。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章