前提・実現したいこと
KinectのUnity Assetを使って複数人のジェスチャー認識の実装を試みています。
参考書籍
KINECT for Windows SDKプログラミングKinect for Windows v2センサー対応版
参考サイト
https://tarukosu.hatenablog.com/entry/2017/04/16/190440
書籍やサイトを参考に実装したところ、
UnityエディタでPlayをすると認識は上手く行っているように見受けられますが
Stopを押した途端に以下のエラーメッセージが発生し、Unityエディタがフリーズしてしまいます。
発生している問題・エラーメッセージ
InvalidOperationException: Handle is not initialized. System.Runtime.InteropServices.GCHandle.Free () (at <567df3e0919241ba98db88bec4c6696f>:0) Microsoft.Kinect.VisualGestureBuilder.VisualGestureBuilderFrameReader.__EventCleanup () (at Assets/Standard Assets/Microsoft/Kinect/VisualGestureBuilder/VisualGestureBuilderFrameReader.cs:274) Microsoft.Kinect.VisualGestureBuilder.VisualGestureBuilderFrameReader.Dispose (System.Boolean disposing) (at Assets/Standard Assets/Microsoft/Kinect/VisualGestureBuilder/VisualGestureBuilderFrameReader.cs:38) Microsoft.Kinect.VisualGestureBuilder.VisualGestureBuilderFrameReader.Dispose () (at Assets/Standard Assets/Microsoft/Kinect/VisualGestureBuilder/VisualGestureBuilderFrameReader.cs:256) Helper.NativeObjectCache.Flush () (at Assets/Standard Assets/NativeObjectCache.cs:39) Helper.EventPump.OnApplicationQuit () (at Assets/Standard Assets/EventPump.cs:67)
該当のソースコード
C#
1using UnityEngine; 2using System.Collections; 3using System.Collections.Generic; 4using Windows.Kinect; 5using Microsoft.Kinect.VisualGestureBuilder; 6 7public class GestureSourceManager : MonoBehaviour 8{ 9 public string databasePath; 10 11 private KinectSensor _Sensor; 12 private BodyFrameReader bodyFrameReader; 13 private VisualGestureBuilderDatabase _Database; 14 private VisualGestureBuilderFrameSource[] _Sources; 15 private VisualGestureBuilderFrameReader[] _Readers; 16 17 private IReadOnlyList<Gesture> gestures; 18 private int BODY_COUNT = 6; 19 20 // Use this for initialization 21 public void Start() 22 { 23 _Sensor = KinectSensor.GetDefault(); 24 if (_Sensor != null) 25 { 26 27 if (!_Sensor.IsOpen) 28 { 29 _Sensor.Open(); 30 } 31 32 _Readers = new VisualGestureBuilderFrameReader[BODY_COUNT]; 33 _Sources = new VisualGestureBuilderFrameSource[BODY_COUNT]; 34 35 for (int count = 0; count < BODY_COUNT; count++) 36 { 37 // Set up Gesture Source 38 _Sources[count] = VisualGestureBuilderFrameSource.Create(_Sensor, 0); 39 40 // open the reader for the vgb frames 41 _Readers[count] = _Sources[count].OpenReader(); 42 _Readers[count].IsPaused = true; 43 _Readers[count].FrameArrived += GestureFrameArrived; 44 } 45 46 // load the 'Seated' gesture from the gesture database 47 string path = System.IO.Path.Combine(Application.streamingAssetsPath, databasePath); 48 _Database = VisualGestureBuilderDatabase.Create(path); 49 50 // Load all gestures 51 gestures = (IReadOnlyList<Gesture>)_Database.AvailableGestures; 52 53 for (int count = 0; count < BODY_COUNT; count++) 54 { 55 _Sources[count].AddGestures((Gesture[]) gestures); 56 57 foreach (var g in gestures) 58 { 59 _Sources[count].SetIsEnabled(g, true); 60 } 61 } 62 } 63 64 bodyFrameReader = _Sensor.BodyFrameSource.OpenReader(); 65 bodyFrameReader.FrameArrived += bodyFrameReader_FrameArrived; 66 Debug.Log("Sensing: " + _Sensor.IsOpen.ToString()); 67 } 68 // Check Body Manager, grab first valid body 69 void bodyFrameReader_FrameArrived(object sender, BodyFrameArrivedEventArgs e) 70 { 71 ... 72 } 73 74 /// Handles gesture detection results arriving from the sensor for the associated body tracking Id 75 private void GestureFrameArrived(object sender, VisualGestureBuilderFrameArrivedEventArgs e) 76 { 77 ... 78 }
試したこと
気になっている点としてはVisualGestureBuilderFrameSourceのインスタンス生成時に書籍では
gestureSource = new VisualGestureBuilderFrameSource(sensor, 0);
と記述するところをUnity上では
gestureSource = VisualGestureBuilderFrameSource.Create(sensor, 0);
と記述しないと'VisualGestureBuilderFrameSource' には、引数 2 を指定するコンストラクターは含まれていません。
と怒られてしまう点ですが解決の糸口が見えず相談した次第です。
補足情報(FW/ツールのバージョンなど)
KinectV2
Windows10
Unity 2019.2.17f1
Kinect.2.0.1410.19000.unitypackage
Kinect.VisualGestureBuilder.2.0.1410.19000.unitypackage
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。