Top > Kinect > KinectForWindowsSDK > Tips > SkeletonCoordinate
Last-modified: Fri, 08 Jun 2012 08:08:30 JST
Counter:8405 Today:1 Yesterday:6 Online:6
このエントリーをはてなブックマークに追加

骨格の座標系の確認

骨格座標系の図

0.png

 図のように、骨格座標系はKinectのIR(赤外線)カメラを中心に、右手座標系である。また深度(Z)方向に関しては原則としてマイナス方向を取得しない(※推定不能値-1を除く)。KinectForWindowsSDKでは、深度値が「mm(ミリ)」であるのに対し、骨格座標系は「m (メートル)」単位であることに注意する。

骨格座標系の原点を確認する

 骨格取得に関してコアな部分はIRカメラによる観測であって、そうであるなら当然IRカメラを中心とする座標系で展開されているのだろうなぁと推測していた。しかしながらこれに関する正確なデータを公開している資料を見つけることが出来なかったので簡単にプログラムを書いて確認した。確認のためのソースコードは次の通り。手順は至極簡単で、まず任意の「SkeletonPoint」を生成し、その座標を(0,0,1)とする。これをIRカメラと通常のカメラの座標系に直して出力すれば、原点の位置が把握できるというわけだ。

   SkeletonPoint skeletonPoint = new SkeletonPoint() { X = 0, Y = 0, Z = 1 };
   ColorImagePoint cameraImagePoint = kinect.MapSkeletonPointToColor(
       skeletonPoint, ColorImageFormat.RgbResolution640x480Fps30);
   DepthImagePoint depthImagePoint = kinect.MapSkeletonPointToDepth(
       skeletonPoint, DepthImageFormat.Resolution640x480Fps30);

   Console.WriteLine("骨格座標系["+skeletonPoint.X+","+skeletonPoint.Y+"]");
   Console.WriteLine("深度座標系[" + depthImagePoint.X + "," + depthImagePoint.Y + "]");
   Console.WriteLine("カメラ座標系["+cameraImagePoint.X+","+cameraImagePoint.Y+"]");

 出力結果は次の通りで、深度もカメラも640解像度で取得していることから、丁度中央の数値を示しているIRカメラを中心とする座標系で間違いが無いことが分かった。

骨格座標系[0,0]
深度座標系[320,240]
カメラ座標系[337,265]

「SkeletonPoint」の深度値(=Z)が0である場合、変換値は次の様になるので注意する。

  • 骨格座標系[0,0]
  • 深度座標系[0,0]
  • カメラ座標系[44,36]

右手座標系を確認する

 念のため右手座標系であることも確認しておく。1行サンプルではあるが、SkeletonFrameReadyイベントの内部で骨格を取得して出力していることを察して頂きたい。頭をKinectに向かって右に動かすと正の値、向かって左に動かすと負の値が出力されることが分かる。

 Console.WriteLine(skeleton.Joints[JointType.Head].Position.X);