AccessViolation Exception

仕事でもはんだづけ、家でもはんだづけ

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行に収まった幸せ。

f:id:kamiyaowl:20140304035931p:plain

あとはサンプルみたいに有効範囲外のデータをそぎ落とせばいいのかな。 それ以前にUIスレッドであまりこういうことするのはよくなさそう

*1:当初何も考えずbyte型(8bit)にけた落ちさせるなどというわけわからんことしてた。多分RGBに合わせていたのかと思われる