Kinect SDK for Windows

提供: KZK memo wiki
移動: 案内検索

Kinect for Windows Quickstart Series を視聴。理解メモ。

プロジェクトの作成

WPF アプリケーションを指定。

  1. プロジェクトの参照設定よりMicrosoft.Kinectを追加。

基本準備

MainWindow.xaml.cs 冒頭に以下のusing を追加。

 using Microsoft.Kinect;

Kinectセンサの取得

取得方法1

KiectSensor _sensor;
if (KinectSensor.KinectSensors.Count >= 0)
{
    _sensor = KinectSensor.KinectSensors[0];
}

取得方法2

KinectSensor _sensor = ( from sensorToCheck in KinectSensor.KinectSensors
                        where sensorToCheck.Status == KinectStatus.Connected
                        select sensorToCheck).FirstOrDefault();

Kinectセンサの起動

_sensor.Start();

イベントハンドラーの追加 (AllFramesReady Event)

AllFramesReady Event はKinectで処理されるFrameDataが準備されると発生する。 AllFramesReadyEventArgsより各種フレームデータを取得し、処理を加える。

_sensor.AllFramesReady += new EventHandler<AllFramesReadyEventArgs>(_sensor_AllFramesReady);


利用するデータが限定的な場合はAllFramesReady以外にも次の通り用意されている。

  • ColorFrameReady
  • DepthFrameReady
  • SkeletonFrameReady

Kinectセンサの停止

_sensor.Stop();


一連の流れ

  1.         KinectSensor _sensor;
  2.  
  3.         private void Window_Loaded(object sender, RoutedEventArgs e)
  4.         {
  5.  
  6.             if (KinectSensor.KinectSensors.Count >= 0)
  7.             {
  8.                 _sensor = KinectSensor.KinectSensors[0];
  9.                 _sensor.AllFramesReady += new EventHandler<AllFramesReadyEventArgs>(_sensor_AllFramesReady);
  10.  
  11.                 _sensor.Start();
  12.             }
  13.  
  14.         }
  15.  
  16.         void _sensor_AllFramesReady(object sender, AllFramesReadyEventArgs e)
  17.         {
  18.  
  19.             /*
  20.             *
  21.             * e(AllFramsReadyEventArgs)から各種フレームデータを取得し処理をする。
  22.             *
  23.             * ※各種フレームデータ
  24.             *  * ColorImageFrame  :カメラ映像
  25.             *  * DepthImageFrame  :奥行きデータ
  26.             *  * SkeletonFrame    :人物認識データ
  27.             *
  28.             */
  29.  
  30.  
  31.  
  32.            
  33.         }
  34.  
  35.         private void Window_Closed(object sender, EventArgs e)
  36.         {
  37.             kinect.Stop();
  38.         }

ColorImageFrame (カメラ映像の出力)

前提

  1. MainWindowにツールボックスよりImageを配置。
  2. 名称をimage_ColorFrameとする。
  3. サイズを320x240(WxH)に設定する。
  4. KinectのColorSensorの映像をimage_ColorFrameに描画する。

SourceCode

  1. private void Window_Loaded(object sender, RoutedEventArgs e)
  2. {
  3.  
  4.     if (KinectSensor.KinectSensors.Count >= 0)
  5.     {
  6.         _sensor = KinectSensor.KinectSensors[0];
  7.         _sensor.ColorStream.Enable();
  8.         _sensor.AllFramesReady += new EventHandler<AllFramesReadyEventArgs>(_sensor_AllFramesReady);
  9.  
  10.         _sensor.Start();
  11.     }
  12.  
  13. }
  14.  
  15. void _sensor_AllFramesReady(object sender, AllFramesReadyEventArgs e)
  16. {
  17.     using (ColorImageFrame colorFrame = e.OpenColorImageFrame())
  18.     {
  19.         if (colorFrame != null)
  20.         {
  21.             byte[] pixels = new byte[colorFrame.PixelDataLength];
  22.             colorFrame.CopyPixelDataTo(pixels);
  23.  
  24.             image_ColorFrame.Source = BitmapSource.Create(
  25.                 colorFrame.Width
  26.                 , colorFrame.Height
  27.                 , 96, 96
  28.                 , PixelFormats.Bgr32
  29.                 , null
  30.                 , pixels
  31.                 , colorFrame.Width * 4
  32.                 );
  33.         }
  34.     }
  35.    
  36. }
  37.  
  38. private void Window_Closed(object sender, EventArgs e)
  39. {
  40.     stopKinectSensor(_sensor);
  41. }
  42.  
  43. private void stopKinectSensor(KinectSensor kinect)
  44. {
  45.     kinect.Stop();
  46. }

MEMO

  • RGBカメラからの映像を取得するにはColorStreamを有効にする必要がある。(L.7)

DepthImageFrame (距離映像の出力)

DepthImageFrameで取得される情報は、カメラ映像上の各ピクセルに該当する距離情報人物情報である。DepthImageFrameで取得された情報をImageとして表現するためには距離情報や人物情報を利用してBitmapデータを作成する必要がある。


前提

  1. MainWindowにToolBoxよりImageを配置。
  2. 名称をimage_DepthFrameとする。
  3. サイズを320x240(WxH)に設定する。
  4. KinectのDepthSensorから情報を元にビットマップデータを生成する。
  5. 生成されたビットマップデータをimage_DepthFrameに描画する。

SourceCode

  1. private void Window_Loaded(object sender, RoutedEventArgs e)
  2. {
  3.     if (KinectSensor.KinectSensors.Count >= 0)
  4.     {
  5.         _sensor = KinectSensor.KinectSensors[0];
  6.  
  7.         stopKinectSensor(_sensor);
  8.  
  9.         _sensor.DepthStream.Enable(DepthImageFormat.Resolution320x240Fps30);
  10.         //_sensor.SkeletonStream.Enable();
  11.         _sensor.AllFramesReady += new EventHandler<AllFramesReadyEventArgs>(_sensor_AllFramesReady);
  12.         _sensor.Start();
  13.     }
  14.  
  15. }
  16.  
  17. void _sensor_AllFramesReady(object sender, AllFramesReadyEventArgs e)
  18. {
  19.     using (DepthImageFrame depthFrame = e.OpenDepthImageFrame())
  20.     {
  21.  
  22.         if (depthFrame != null)
  23.         {
  24.  
  25.             short[] rawDepthData = new short[depthFrame.PixelDataLength];
  26.             byte[] pixels = new byte[depthFrame.Height * depthFrame.Width * 4];
  27.  
  28.             depthFrame.CopyPixelDataTo(rawDepthData);
  29.  
  30.             for (int depthIndex = 0, colorIndex = 0;
  31.                      depthIndex < rawDepthData.Length && colorIndex < pixels.Length;
  32.                      depthIndex++, colorIndex += 4)
  33.             {
  34.                 //int player = rawDepthData[depthIndex] & DepthImageFrame.PlayerIndexBitmask;
  35.                 int depth = rawDepthData[depthIndex] >> DepthImageFrame.PlayerIndexBitmaskWidth;
  36.  
  37.                 double color = 255 - depth / 255;
  38.                 pixels[colorIndex + 0] = (byte)color;
  39.                 pixels[colorIndex + 1] = (byte)color;
  40.                 pixels[colorIndex + 2] = (byte)color;
  41.  
  42.             }
  43.  
  44.             try
  45.             {
  46.                 image_DepthFrame.Source = BitmapSource.Create(
  47.                     depthFrame.Width
  48.                     , depthFrame.Height
  49.                     , 96, 96
  50.                     , PixelFormats.Bgr32
  51.                     , null
  52.                     , pixels
  53.                     , depthFrame.Width * 4
  54.                     );
  55.  
  56.             }
  57.             catch (OutOfMemoryException memory_e)
  58.             {
  59.                 Debug.WriteLine(memory_e.Message);
  60.             }
  61.  
  62.         }
  63.  
  64.     }
  65. }
  66.  
  67. private void Window_Closed(object sender, EventArgs e)
  68. {
  69.     stopKinectSensor(_sensor);
  70. }
  71.  
  72. private void stopKinectSensor(KinectSensor kinect)
  73. {
  74.     kinect.Stop();
  75. }


MEMO

DepthImageFrame depthFrame = e.OpenDepthImageFrame()
short[] rawDepthData = new short[depthFrame.pixelDataLength];


//人物認識:論理積による自分の有無を算出する。
int player = rawDepthData[depthIndex] & DepthImageFrame.PlayerIndexBitmask;
 
//距離認識:シフト演算によって、人物情報分をデータから取り除く。
int depth = rawDepthData[depthIndex] >> DepthImageFrame.PlayerIndexBitmaskWidth;

SkeletonFrame (人物認識映像の出力)

Kinectは6人まで認識可能。スケルトントラッキングは2人まで。 取り扱うSkeletonデータを取り出し処理を加える。DepthImageFrameと同様にImageとして表現させるためには専用に処理する必要がある。


前提

  1. MainWindowにToolBoxよりLabelを3つ配置。
  2. 名称をlabel_Headlabel_RightHandlabel_LeftHandとする。
  3. サイズを80x30(WxH)に設定する。
  4. KinectのDepthSensorから情報とSkeletonFrameの情報を元に各Labelをマッピングする。

SourceCode

  1. private void Window_Loaded(object sender, RoutedEventArgs e)
  2. {
  3.  
  4.     if (KinectSensor.KinectSensors.Count >= 0)
  5.     {
  6.         _sensor = KinectSensor.KinectSensors[0];
  7.  
  8.         stopKinectSensor(_sensor);
  9.  
  10.         _sensor.ColorStream.Enable();
  11.         _sensor.DepthStream.Enable(DepthImageFormat.Resolution320x240Fps30);
  12.         _sensor.SkeletonStream.Enable();
  13.         _sensor.AllFramesReady += new EventHandler<AllFramesReadyEventArgs>(_sensor_AllFramesReady);
  14.  
  15.         _sensor.Start();
  16.     }
  17.  
  18. }
  19.  
  20. void _sensor_AllFramesReady(object sender, AllFramesReadyEventArgs e)
  21. {
  22.     using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame() )
  23.     {
  24.  
  25.         if (skeletonFrame != null)
  26.         {
  27.  
  28.             Skeleton[] allSkelton = new Skeleton[6];
  29.  
  30.             skeletonFrame.CopySkeletonDataTo(allSkelton);
  31.  
  32.             Skeleton playerSkeleton = (from x in allSkelton
  33.                                        where x.TrackingState == SkeletonTrackingState.Tracked
  34.                                        select x).FirstOrDefault();
  35.  
  36.  
  37.             if (playerSkeleton != null)
  38.             {
  39.                 using (DepthImageFrame depthFrame = e.OpenDepthImageFrame())
  40.                 {
  41.                     if (depthFrame != null)
  42.                     {
  43.                         try
  44.                         {
  45.                             DepthImagePoint headDepthPoint
  46.                                       = depthFrame.MapFromSkeletonPoint(playerSkeleton.Joints[JointType.Head].Position);
  47.                             DepthImagePoint rhandDepthPoint
  48.                                       = depthFrame.MapFromSkeletonPoint(playerSkeleton.Joints[JointType.HandRight].Position);
  49.                             DepthImagePoint lhandDepthPoint
  50.                                       = depthFrame.MapFromSkeletonPoint(playerSkeleton.Joints[JointType.HandLeft].Position);
  51.  
  52.                             ColorImagePoint headColorPoint
  53.                                       = depthFrame.MapToColorImagePoint( headDepthPoint.X
  54.                                                                        , headDepthPoint.Y
  55.                                                                        , ColorImageFormat.RgbResolution640x480Fps30);
  56.                             ColorImagePoint rhandColorPoint
  57.                                       = depthFrame.MapToColorImagePoint( rhandDepthPoint.X
  58.                                                                        , rhandDepthPoint.Y
  59.                                                                        , ColorImageFormat.RgbResolution640x480Fps30);
  60.                             ColorImagePoint lhandColorPoint
  61.                                       = depthFrame.MapToColorImagePoint( lhandDepthPoint.X
  62.                                                                        , lhandDepthPoint.Y
  63.                                                                        , ColorImageFormat.RgbResolution640x480Fps30);
  64.  
  65.                             Debug.WriteLine("X:" + playerSkeleton.Position.X);
  66.                             Debug.WriteLine("Y:" + playerSkeleton.Position.Y);
  67.  
  68.                             Canvas.SetTop(label_Head, headColorPoint.Y / 2 - label_Head.Height / 2);
  69.                             Canvas.SetLeft(label_Head, headColorPoint.X / 2 - label_Head.Width / 2);
  70.  
  71.                             Canvas.SetTop(label_LeftHand, lhandColorPoint.Y / 2 - label_LeftHand.Height / 2);
  72.                             Canvas.SetLeft(label_LeftHand, lhandColorPoint.X / 2 - label_LeftHand.Width / 2);
  73.  
  74.                             Canvas.SetTop(label_RightHand, rhandColorPoint.Y / 2 - label_RightHand.Height / 2);
  75.                             Canvas.SetLeft(label_RightHand, rhandColorPoint.X / 2 - label_RightHand.Width / 2);
  76.                         }
  77.                         catch (Exception exeption_e)
  78.                         {
  79.                             Debug.WriteLine(exeption_e.Message);
  80.                         }
  81.                     }
  82.                 }
  83.             }
  84.         }
  85.     }
  86. }
  87.  
  88. private void Window_Closed(object sender, EventArgs e)
  89. {
  90.     stopKinectSensor(_sensor);
  91. }
  92.  
  93. private void stopKinectSensor(KinectSensor kinect)
  94. {
  95.     kinect.Stop();
  96. }

MEMO

SkeletonStream

Kinect Audio

Speech

  1. Microsoft.Speech SDK をダウンロード Microsoft Speech Platform - Software Development Kit (SDK) (Version 11)
  2. 参照の追加
    1. 参照設定
    2. 参照の追加
    3. 参照タブ
    4. C:\Program Files\Microsoft SDKs\Speech\v11.0\Assembly\Microsoft.Speech.dll
  3. using Microsoft.Speech.Recognition;

blog comments powered by Disqus