Log in

Leap Motion でアプリ開発 - Leap Motion からの入力

  • Public
By 山下 雅也 1555 days ago

目次へ戻る

今回は C# で Leap Motion のサンプルアプリケーションをつくります。

まず、Visual Studio 2012 で新規プロジェクトを作成します。[ファイル]メニュー - [新規作成] - [プロジェクト]より、[Visual C#] の[WPF アプリケーション]を選びます。プロジェクト名は[LeapSample]としました。

次に、[プロジェクト]メニュー - [参照の追加] から、 [ブラウズ] の[参照]ボタンを押して、SDK に付属の LeapCSharp.NET4.0.dll を参照します。LeapCSharp.NET4.0.dll は SDK の lib フォルダに含まれていますが、アプリケーション実行時にはさらにその下の x86 または x64 フォルダに含まれる dll のうち Leap.dll、LeapCSharp.dll も必要になりますので、ビルド後 exe が生成されたフォルダにコピーしておきます。

試しに MainWindows.xaml.cs を以下のように書き換え、実行してみます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
 
namespace LeapSample
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        private Leap.Controller controller = new Leap.Controller();
 
        public MainWindow()
        {
            InitializeComponent();
 
            var root = this.Content as Grid;
            root.Children.Add(new TextBlock());
 
            CompositionTarget.Rendering += CompositionTarget_Rendering;
        }
 
        private void CompositionTarget_Rendering(object sender, EventArgs e)
        {
            var root = this.Content as Grid;
            var textBlock = root.Children[0] as TextBlock;
 
            Leap.Frame frame = controller.Frame();
            string msg = string.Format("IsValid={0}\n", frame.IsValid);
            msg += string.Format("Id={0}\n", frame.Id);
            msg += string.Format("Timestamp={0}\n", frame.Timestamp);
            msg += string.Format("InteractionBox={0}\n", frame.InteractionBox);
            msg += string.Format("CurrentFramesPerSecond={0}\n", frame.CurrentFramesPerSecond);
            msg += string.Format("Hands.Count={0}\n", frame.Hands.Count);
            msg += string.Format("Pointables.Count={0}\n", frame.Pointables.Count);
            msg += string.Format("Fingers.Count={0}\n", frame.Fingers.Count);
            msg += string.Format("Tools.Count={0}\n", frame.Tools.Count);
            textBlock.Text = msg;
        }
    }
}



実行したとき XamlParseException 例外が発生した場合、InnnerException を確認してください。もし「"'Leap.LeapPINVOKE' のタイプ初期化子が例外をスローしました。"」となっているなら dll が不足しているとが原因です。
SDK 付属の lib/x86 以下の dll を exe のあるフォルダ(bin/Debugなど)にコピーしてください。プロジェクトのビルドの設定を x64 にしている場合は、lib/x86 以下の dll を exe のあるフォルダ(bin/x64/Debugなど)にコピーしてください。これで正常に実行できると思います。

Leap Motion を PC に接続して、作成したアプリケーションを実行するとウィンドウに以下のような表示が行われます。

leapsample-1


以下で、Leap Motion Controller から最新の Frame オブジェクトを取得しています。

Leap.Frame frame = controller.Frame();


ちなみに Frame メソッドは引数を指定することで過去の Frame オブジェクトを取得することができます。試してみたところでは、0 ~ 59 が指定可能でした。0 が最新、1 がひとつ前、59 が一番古い Frame オブジェクトが返され、それ以外を指定すると Invalid Frame が返されます。

表示しているのは Frame オブジェクトのプロパティの一部です。
Id は、Frame のユニーク Id です。Leap Motion Controller で手指の動きをキャプチャするごとにインクリメントされます。
Timestamp は Leap Motion がスタートしてからの経過時間です。
CurrentFramesPerSecond は、Leap Motion Controller で行われているキャプチャのフレームレートです。
Hands は認識している手オブジェクトのリストです。
Pointables は認識している指やペンなどのオブジェクトのリストです。Pointables はこの後の Fingers と Tools を含んでいます。Pointable は Finger と Tool のベースクラスとなっています。
Fingers は認識している指オブジェクトのリストです。
Tools は認識しているペンなどのオブジェクトのリストです。

今回はここまでです。

目次へ戻る