質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Kinect

Kinect(キネクト)はマイクロソフトから発売されたジェスチャー・音声認識によって 操作ができるデバイスです。

Q&A

1回答

1643閲覧

KinectV2 Unityで複数人ジェスチャー認識をさせるとプログラム停止時にInvalidOperationExceptionが発生する

hirokun28

総合スコア15

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Kinect

Kinect(キネクト)はマイクロソフトから発売されたジェスチャー・音声認識によって 操作ができるデバイスです。

0グッド

0クリップ

投稿2020/02/08 16:29

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Kinect SDKのDiscreteGestureBasis-WPFサンプルを参考に書き直してみましたが、Unity上ではVisualGestureBuilderFrameSourceインスタンスを複数生成すると停止時に同様のエラーが発生してしまいこれも上手く行きませんでした。
代替案としてWPF上でセンシングした値をOSC通信でUnityに渡す方法を試しています。

投稿2020/02/09 14:02

hirokun28

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問