c# kinectで簡単に距離画像を表示
書籍やそこら辺の情報が古いのとどれもこれも公式にあるようなConvertDepthImage()みたいなのを実装していて最高にかっこわるいし見にくかったので適当に模索していたら出来た。
MapDepthFrameToColorFrame is deprecated method
要するにオワコンってことです。新しいメソッドがあるからそっちを使え。互換性のためだけに残してあるだけですってこと。
新しい方はkinect.CoordinateMapper.MapDepthFrameToColorFrameを使用します。
というかサンプル長い、やたらelse if多いし
やたら長いサンプルコードだったが、IntelliSenseを見てframe.CopyDepthImagePixelDataToを発見し
using (var frame = e.OpenDepthImageFrame()) { if (frame != null) { var depth = new DepthImagePixel[frame.PixelDataLength]; frame.CopyDepthImagePixelDataTo(depth); } }
すればRGB画像とはサイズが違うものの画像が取れることは分かった。
元々はdepthpixelにCopyPixelDataToを使って { depth[15:3], player[2:0] } を取得してマスクを掛けて処理していた。
んでdepthには13bitの距離の群れが入っているのでGray16画像に変換してやることにする。*1
0x1fff -> 0xffffに写像を取れば済むので
short[] pixel = (from d in depth select ((short)(d.Depth * (0xffff / 0x1fff)))).ToArray<short>(); XImageDepth.Source = BitmapSource.Create(frame.Width, frame.Height, 96, 96, PixelFormats.Gray16, null, pixel, frame.Width * frame.BytesPerPixel);
終わり。糞長いサンプルが4行に収まった幸せ。
あとはサンプルみたいに有効範囲外のデータをそぎ落とせばいいのかな。 それ以前にUIスレッドであまりこういうことするのはよくなさそう