Top > Kinect > KinectForWindowsSDK > Tips > DifferenceBtDepthImagePixelAndShortData
Last-modified: Tue, 30 Oct 2012 02:46:40 JST
Counter:3221 Today:1 Yesterday:0 Online:9
このエントリーをはてなブックマークに追加

DepthImagePixelとShortデータの示すDepthの違い

About

 KinectSDK1.6からはDepthImagePixelを利用して簡単にDepthとPlayerIndexを取得することができるようになりました。それ(SDK1.5)以前では、16bitのShort型で定義される深度情報から、DepthとPlayerIndexを自力で分離・取得する必要がありました。そしてSDK1.6以降でも、旧1.5以前の実装は利用することができますし、非推奨にもなっていないようです(SDK1.6時点)。

 取得できる情報については同じですから、処理効率面は兎も角として、DepthImagePixelを利用した方が楽にプログラミング出来ます。ところがShort型を利用した方が望ましい実装となるパターンがあるようです。

  • fileWindowsGame1_BitShift.zip
  • &ref(): File not found: "WindowsGame1_DepthImagePixel.zip" at page "Kinect/KinectForWindowsSDK/Tips/DifferenceBtDepthImagePixelAndShortData";
    • VisualStudio2010
    • KinectSDK1.6
    • XNA4.0

 検証はKinectForWindows/XBOXで行い、NearModeを利用していません。

取得不能深度UnKnownDepthの扱いに差異が

 深度情報Depthを取りだし、その値がどの様な値なのかを識別する実装(例えば「TooFar/NearDepth」)は、Kinectプログラミングでは頻繁に行われます。その内の一つに「DepthStream.UnknownDepth」があります。UnKnownDepthは与えらた深度が測定不能な値であるかどうかを判定する場合に利用され、例えばガラス素材などで赤外線を反射してしまう場合には「UnKnownDepth」となります。この値は基本的には「-1」です。

 SDK1.5以前の実装ではShort型から深度値DepthおよびPlayerIndexを取得し、測定不能なDepth値である場合には、「Depth=-1」となりました。ところがSDK1.6で実装されるDepthImagePixelでは「Depth=-1」とならないようです。つまり測定不能深度をUnKnownDepthを使って識別することができません。代わりに「DepthImagePixel.IsKnownDepthメソッド」が与えられ、測定不能な深度である場合には、メソッドの戻り値がfalseとなります。そして先の通り「DepthImagePixel」では、測定不能なDepthは「-1」ではなくなり、その代わりに「0」が与えられます。

 識別不能なDepthの値「0」は「KinectSensor.TooNearDepth」が示す値と同じとなる可能性があります。(NearModeを使わない状態で)Kinectから「TooNearDepth」を取得すると、その値が0を示すことが分かります。また残念なことに、逆の場合も完全に言える様で、Depthに0が与えられる時は、IsKnownDepthメソッドはfalseを返すようです。

 つまり判定不能な深度情報を識別する場合に、「if(depthImagePixel[i].Depth == UnknownDepth)」という実装はできないわけです。DepthImagePixelのDepthは、判定不能時には0を返してしまい、UnknownDepthは-1を返すわけですから。

結論

  • 測定不能であった場合と、測定範囲よりも近すぎる深度値(TooNearDepth)を返す場合を識別する必要がある時は、Short型のデータを扱う実装が必要である
  • DepthImagePixelを用いて測定不能な深度を識別する場合は、DepthStream.UnknownDepthを使わず、IsKnownDepthメソッドを利用する必要がある。

 このような実装形態がどういう意味を持つのかは別として、Microsoftが1.5以前の実装を非推奨にしなかった理由はここにあるのかも…?しれません。