Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Copyright© 2013, pnop Inc., All Rights Reserved.シナリオAKinectに接続して制御する
Copyright© 2013, pnop Inc., All Rights Reserved.プロジェクトの新規作成
Copyright© 2013, pnop Inc., All Rights Reserved.Kinectのアセンブリを追加
Copyright© 2013, pnop Inc., All Rights Reserved.Kinectセンサーを取得してチルトモーターを動かす Kinectセンサーを取得 var Kinect = Microsoft.Kinect.K...
Copyright© 2013, pnop Inc., All Rights Reserved.コード例static void Main(string[] args){var kinect = Microsoft.Kinect.KinectSe...
Copyright© 2013, pnop Inc., All Rights Reserved.ヒント センサーは複数個取得できるので注意 Start、Stopメソッドで利用開始と終了(Disposeを忘れずに) センサーの利用を開始する...
Copyright© 2013, pnop Inc., All Rights Reserved.シナリオB深度情報を表示する
Copyright© 2013, pnop Inc., All Rights Reserved.WinFormアプリケーションを作る作成後、Kinectのアセンブリ参照も忘れずに
Copyright© 2013, pnop Inc., All Rights Reserved.画面起動時と終了時にセンサーを制御するprivate KinectSensor _Kinect;private void Form1_Load(ob...
Copyright© 2013, pnop Inc., All Rights Reserved.深度情報を得るためにイベントハンドラを登録するprivate void Form1_Load(object sender, EventArgs e)...
Copyright© 2013, pnop Inc., All Rights Reserved.イベントハンドラで深度情報を画像に変換するprivate void KinectOnDepthFrameReady(object sender, D...
Copyright© 2013, pnop Inc., All Rights Reserved.深度情報→Bitmap変換用メソッドpublic Bitmap ConvertToBitmap(byte[] pixels, int width, ...
Copyright© 2013, pnop Inc., All Rights Reserved.実行例
Copyright© 2013, pnop Inc., All Rights Reserved.ヒント Coding4fun Kinect Toolkit を利用するとBitmapへの変換が容易にできます UIスレッドで動作させるとパフォー...
Copyright© 2013, pnop Inc., All Rights Reserved.シナリオC骨格情報の取得
Copyright© 2013, pnop Inc., All Rights Reserved.コンソールアプリケーションの作成 シナリオAを参考に、コンソールアプリケーションを作成します Kinect のアセンブリ追加を忘れずに Kin...
Copyright© 2013, pnop Inc., All Rights Reserved.骨格情報を取得private static void KinectOnSkeletonFrameReady(object sender, Skele...
Copyright© 2013, pnop Inc., All Rights Reserved.実行例
Copyright© 2013, pnop Inc., All Rights Reserved.ヒント 把握できる関節の種類や状態を確認しましょう 関節の座標(右手座標系)をRGBカメラの画像の座標に変換してみましょう var cp = ...
Copyright© 2013, pnop Inc., All Rights Reserved.シナリオDコントロールの活用
Copyright© 2013, pnop Inc., All Rights Reserved.WPFアプリケーションの作成
Copyright© 2013, pnop Inc., All Rights Reserved.Kinect Toolkit を追加する以下の3つのアセンブリを追加します場所:C:¥Program Files¥Microsoft SDKs¥Ki...
Copyright© 2013, pnop Inc., All Rights Reserved.アセンブリの追加 同様に以下のアセンブリをプロジェクトに追加し、出力ディレクトリにコピーされるように設定します 場所: C:¥Program ...
Copyright© 2013, pnop Inc., All Rights Reserved.KinectRegionを追加 MainWindow.Xamlに以下の赤字コードを追加し、Kinectのコントロールが有効な範囲を定義します<Wi...
Copyright© 2013, pnop Inc., All Rights Reserved.KinectTileButtonの追加 MainWindow.Xamlに以下の赤字コードを追加し、Kinectで操作できるボタンとイベントハンドラ...
Copyright© 2013, pnop Inc., All Rights Reserved.イベントハンドラを実装するprivate KinectSensor _Kinect;private void Window_Loaded(objec...
Copyright© 2013, pnop Inc., All Rights Reserved.イベントハンドラを実装する 2private void Window_Closing(object sender,System.ComponentM...
Copyright© 2013, pnop Inc., All Rights Reserved.ヒント 他のコントロールも使ってみましょう グリッドやスクロールビューアー グリップ(つかむ) Kinect Toolkit のソースコード...
Copyright© 2013, pnop Inc., All Rights Reserved.その他
Copyright© 2013, pnop Inc., All Rights Reserved.その他の機能も試してみましょう RGBカメラ 音声認識 Kinect Fusion Face Tracking Kinect Choose...
Upcoming SlideShare
Loading in …5
×

Hands on

720 views

Published on

ITエースをねらえ!プロジェクト #5

Published in: Technology
  • Be the first to comment

Hands on

  1. 1. Copyright© 2013, pnop Inc., All Rights Reserved.シナリオAKinectに接続して制御する
  2. 2. Copyright© 2013, pnop Inc., All Rights Reserved.プロジェクトの新規作成
  3. 3. Copyright© 2013, pnop Inc., All Rights Reserved.Kinectのアセンブリを追加
  4. 4. Copyright© 2013, pnop Inc., All Rights Reserved.Kinectセンサーを取得してチルトモーターを動かす Kinectセンサーを取得 var Kinect = Microsoft.Kinect.KinectSensor.KinectSensors[0]; センサーの現在の状態を表示 Console.WriteLine(“Status:” + Kinect.Status); センサーを利用可能にする kinect.Start(); 現在の角度を表示 Console.WriteLine("Current Angle:" + kinect.ElevationAngle); Console.WriteLine("Max Angle:" + kinect.MaxElevationAngle); Console.WriteLine("Min Angle:" + kinect.MinElevationAngle); 新しい角度を指定する kinect.ElevationAngle = angle; センサーの利用を停止する kinect.Stop(); kinect.Dispose();
  5. 5. Copyright© 2013, pnop Inc., All Rights Reserved.コード例static void Main(string[] args){var kinect = Microsoft.Kinect.KinectSensor.KinectSensors[0];Console.WriteLine("Status:" + kinect.Status);kinect.Start();Console.WriteLine("Current Angle:" + kinect.ElevationAngle);Console.WriteLine("Max Angle:" + kinect.MaxElevationAngle);Console.WriteLine("Min Angle:" + kinect.MinElevationAngle);Console.Write("New Angle?:");var angle = int.Parse(Console.ReadLine());kinect.ElevationAngle = angle;Console.WriteLine("Current Angle:" + kinect.ElevationAngle);kinect.Stop();kinect.Dispose();Console.ReadKey();}
  6. 6. Copyright© 2013, pnop Inc., All Rights Reserved.ヒント センサーは複数個取得できるので注意 Start、Stopメソッドで利用開始と終了(Disposeを忘れずに) センサーの利用を開始すると、そのセンサーは他のプロセスからは利用できなくなります
  7. 7. Copyright© 2013, pnop Inc., All Rights Reserved.シナリオB深度情報を表示する
  8. 8. Copyright© 2013, pnop Inc., All Rights Reserved.WinFormアプリケーションを作る作成後、Kinectのアセンブリ参照も忘れずに
  9. 9. Copyright© 2013, pnop Inc., All Rights Reserved.画面起動時と終了時にセンサーを制御するprivate KinectSensor _Kinect;private void Form1_Load(object sender, EventArgs e){_Kinect = KinectSensor.KinectSensors[0];_Kinect.Start();}private void Form1_FormClosing(object sender, FormClosingEventArgs e){_Kinect.Stop();_Kinect.Dispose();}
  10. 10. Copyright© 2013, pnop Inc., All Rights Reserved.深度情報を得るためにイベントハンドラを登録するprivate void Form1_Load(object sender, EventArgs e){_Kinect = KinectSensor.KinectSensors[0];_Kinect.DepthFrameReady += KinectOnDepthFrameReady;_Kinect.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30);_Kinect.Start();}private void KinectOnDepthFrameReady(object sender, DepthImageFrameReadyEventArgsdepthImageFrameReadyEventArgs){}
  11. 11. Copyright© 2013, pnop Inc., All Rights Reserved.イベントハンドラで深度情報を画像に変換するprivate void KinectOnDepthFrameReady(object sender, DepthImageFrameReadyEventArgs depthImageFrameReadyEventArgs){using (DepthImageFrame temp = depthImageFrameReadyEventArgs.OpenDepthImageFrame()){if (temp == null) return;short[] depthData = new short[640 * 480];byte[] depthColorData = new byte[640 * 480 * 4];temp.CopyPixelDataTo(depthData);for (int i = 0, i32 = 0; i < depthData.Length && i32 < depthColorData.Length; i++, i32 += 4){//深度情報のみ取得int realDepth = depthData[i] >> DepthImageFrame.PlayerIndexBitmaskWidth;//得られた深度を256段階のグレースケールにbyte intensity = (byte)(255 - (255 * realDepth / 4095));depthColorData[i32] = intensity;depthColorData[i32+1] = intensity;depthColorData[i32+2] = intensity;}//深度情報の配列をBitmapにして表示this.pictureBox1.Image = ConvertToBitmap(depthColorData, 640, 480);}}
  12. 12. Copyright© 2013, pnop Inc., All Rights Reserved.深度情報→Bitmap変換用メソッドpublic Bitmap ConvertToBitmap(byte[] pixels, int width, int height){if (pixels == null) return null;var bitmap = new Bitmap(width,height,System.Drawing.Imaging.PixelFormat.Format32bppRgb);var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),ImageLockMode.ReadWrite, bitmap.PixelFormat);Marshal.Copy(pixels, 0, data.Scan0, pixels.Length);bitmap.UnlockBits(data);return bitmap;}
  13. 13. Copyright© 2013, pnop Inc., All Rights Reserved.実行例
  14. 14. Copyright© 2013, pnop Inc., All Rights Reserved.ヒント Coding4fun Kinect Toolkit を利用するとBitmapへの変換が容易にできます UIスレッドで動作させるとパフォーマンスに支障が出る場合があります 別スレッドで処理するなど工夫しましょう DepthFrameReady は指定したFPS(期待値)で情報が流れるたびにイベントが発生します イベント駆動ではなく、OpenNextFrameを使って任意のタイミングの深度情報を取得してみましょう 深度やプレイヤーに応じて色を変えるなど工夫してみましょう 距離の測定、人の識別、マスク処理など Visual Studioのデバッグ機能を使って1フレームにどのような情報があるか見てみましょう 深度情報は1画素あたり以下のデータで流れてきます ビット操作を行い、プレイヤー情報と深度情報を分離する必要がありますShort型 (2byte/16bit)Bit[0]01234567Bit[1]01234567プレイヤー番号深度情報
  15. 15. Copyright© 2013, pnop Inc., All Rights Reserved.シナリオC骨格情報の取得
  16. 16. Copyright© 2013, pnop Inc., All Rights Reserved.コンソールアプリケーションの作成 シナリオAを参考に、コンソールアプリケーションを作成します Kinect のアセンブリ追加を忘れずに Kinect の利用開始・終了のコードを記述します スケルトンのストリームとイベントハンドラの準備を行いますkinect.SkeletonFrameReady += KinectOnSkeletonFrameReady;kinect.SkeletonStream.Enable();private static void KinectOnSkeletonFrameReady(object sender,SkeletonFrameReadyEventArgs skeletonFrameReadyEventArgs){}
  17. 17. Copyright© 2013, pnop Inc., All Rights Reserved.骨格情報を取得private static void KinectOnSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs skeletonFrameReadyEventArgs){using (var frame = skeletonFrameReadyEventArgs.OpenSkeletonFrame()){if (frame == null) return;//フレームに含まれる骨格情報を取得するvar skeletonData = new Skeleton[frame.SkeletonArrayLength];frame.CopySkeletonDataTo(skeletonData);foreach (var skeleton in skeletonData){if (skeleton == null) break;//トラッキングできている骨格だけ取得if (skeleton.TrackingState != SkeletonTrackingState.Tracked) continue;foreach (Joint joint in skeleton.Joints){//トラッキングできている関節だけ取得if (joint.TrackingState != JointTrackingState.Tracked) continue;Console.WriteLine("JointType: {0}¥t X: {1} ¥t Y: {2} ¥t Z: {3}", joint.JointType,joint.Position.X, joint.Position.Y, joint.Position.Z);}}}}
  18. 18. Copyright© 2013, pnop Inc., All Rights Reserved.実行例
  19. 19. Copyright© 2013, pnop Inc., All Rights Reserved.ヒント 把握できる関節の種類や状態を確認しましょう 関節の座標(右手座標系)をRGBカメラの画像の座標に変換してみましょう var cp = (sender asKinectSensor).CoordinateMapper.MapSkeletonPointToColorPoint(joint.Position, ColorImageFormat.RawBayerResolution640x480Fps30); 既定のトラッキングとシートモードでのトラッキングの違いを見てみましょう Windows FormアプリケーションやWPFアプリケーションを使用して、関節を描画してみましょう TransformSmoothParameters を使用してスムージングの効果を見てみましょうkinect.SkeletonStream.Enable(new TransformSmoothParameters(){Correction = 0.4f,JitterRadius = 0.1f,MaxDeviationRadius = 0.1f,Prediction = 0.6f,Smoothing = 0.8f});
  20. 20. Copyright© 2013, pnop Inc., All Rights Reserved.シナリオDコントロールの活用
  21. 21. Copyright© 2013, pnop Inc., All Rights Reserved.WPFアプリケーションの作成
  22. 22. Copyright© 2013, pnop Inc., All Rights Reserved.Kinect Toolkit を追加する以下の3つのアセンブリを追加します場所:C:¥Program Files¥Microsoft SDKs¥Kinect¥Developer Toolkit v1.7.0¥Assemblies対象:Microsoft.Kinect.Toolkit.dllMicrosoft.Kinect.Toolkit.Controls.dllMicrosoft.Kinect.Toolkit.Interaction.dll
  23. 23. Copyright© 2013, pnop Inc., All Rights Reserved.アセンブリの追加 同様に以下のアセンブリをプロジェクトに追加し、出力ディレクトリにコピーされるように設定します 場所: C:¥Program Files¥Microsoft SDKs¥Kinect¥Developer Toolkit v1.7.0¥Redist¥amd64 および C:¥Program Files¥Microsoft SDKs¥Kinect¥Developer Toolkit v1.7.0¥Redist¥x86 対象: KinectInteraction170_64.dll KinectInteraction170_32.dll
  24. 24. Copyright© 2013, pnop Inc., All Rights Reserved.KinectRegionを追加 MainWindow.Xamlに以下の赤字コードを追加し、Kinectのコントロールが有効な範囲を定義します<Window x:Class="シナリオD.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:k="http://schemas.microsoft.com/kinect/2013"Title="MainWindow" Height="768" Width="1024"><Grid><k:KinectRegion x:Name="kinectRegion"></k:KinectRegion></Grid></Window>
  25. 25. Copyright© 2013, pnop Inc., All Rights Reserved.KinectTileButtonの追加 MainWindow.Xamlに以下の赤字コードを追加し、Kinectで操作できるボタンとイベントハンドラを追加します 同様にKinectの開始と終了処理を行うイベントハンドラを追加します<Window x:Class="シナリオD.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:k="http://schemas.microsoft.com/kinect/2013"Title="MainWindow" Height="768" Width="1024"Loaded="Window_Loaded" Closing="Window_Closing"><Grid><k:KinectRegion x:Name="kinectRegion"><k:KinectTileButtonClick="KinectTileButton_Click" Label="Press!"/></k:KinectRegion></Grid></Window>
  26. 26. Copyright© 2013, pnop Inc., All Rights Reserved.イベントハンドラを実装するprivate KinectSensor _Kinect;private void Window_Loaded(object sender, RoutedEventArgs e){_Kinect = KinectSensor.KinectSensors[0];_Kinect.SkeletonStream.Enable();_Kinect.DepthStream.Enable();_Kinect.Start();//KinectRegionコントロールにKinectセンサーをバインドするkinectRegion.KinectSensor = _Kinect;}
  27. 27. Copyright© 2013, pnop Inc., All Rights Reserved.イベントハンドラを実装する 2private void Window_Closing(object sender,System.ComponentModel.CancelEventArgs e){_Kinect.Stop();_Kinect.Dispose();}private void KinectTileButton_Click(object sender, RoutedEventArgse){MessageBox.Show("OK!");}
  28. 28. Copyright© 2013, pnop Inc., All Rights Reserved.ヒント 他のコントロールも使ってみましょう グリッドやスクロールビューアー グリップ(つかむ) Kinect Toolkit のソースコードを基に動作を変えてみましょう アイコン 判定条件の変更など マウスカーソルの変わりだけでなく、他のジェスチャーも組み込んでみましょう 手振りによる操作など 関節の角度や位置の計算 基点となる関節と合わせて相対的に 深度情報との組み合わせ 押す・引くなどの操作 Kinectが活きるデザインを考えてみましょう
  29. 29. Copyright© 2013, pnop Inc., All Rights Reserved.その他
  30. 30. Copyright© 2013, pnop Inc., All Rights Reserved.その他の機能も試してみましょう RGBカメラ 音声認識 Kinect Fusion Face Tracking Kinect Chooser ネットワーク通信 より良いコードにしてみましょう 無駄を省いてシンプルに / パフォーマンスと効率について センサーは生き物です デバイスの状態、リトライ データがないとき・うまく取れないとき ノイズ対策 ゆとりましょう 便利なツールキットやライブラリの活用

×