ColorFrameReader

発売から約2年ぐらい経ったv2、最近の動向はどうなんだろう
ニュース検索してもめっきり話題が少ない気がしてちょっと悲しい・・。

けどこれからv2のプログラミングを始める人もいるだろうから
ちょっとずつではあるけど自分の得た知識・知恵を書き連ねていこうと思う。
ちなみに自分はWPFで制作してるのでC++に関してはさっぱりです。

いい歳してCとC++、果てはjavaまでもよく分かってないんでちょっと将来が心配。。。

さて今回はもっとも基本となるColorFrameReaderについて。
RGB映像を出力するのに必要なFrameReader、色情報だけなので扱い方もすぐ覚えられます。
極力少ないロジックでRGBカメラを起動させましょう。

■用意するもの
・当たり前だけどKinect
・今回の主役ColorFrameReader
・一応のFrameDescription
・カラーデータを退避させるバッファ領域の配列byte[]
・WriteableBitmap

上から順にこう。
private static KinectSensor kinect = null;
private ColorFrameReader cReader = null;
private FrameDescription cDesc = null;
private byte[] cBuff = null;
private WriteableBitmap wBitmap = null;


まずはKinectをスタートさせる前に下準備としてもろもろ定義しておく。
FrameDescriptionはメモリへの負荷と言う面でFrameArrived内で毎回読み出すのはナンセンスのようなので、
自分はいつもWindowのコンストラクタかLoaded時にやってます。
(むしろ固定値でも構わないとすら思ってるけど・・・)

kinect = KinectSensor.GetDefault();
cReader = kinect.ColorFrameSource.OpenReader();
cDesc = kinect.ColorFrameSource.FrameDescription;
cBuff = new byte[cDesc.Width * cDesc.Height * 4];
wBitmap = new WriteableBitmap(cDesc.Width, cDesc.Height, 96.0, 96.0, PixelFormats.Bgra32, null);


1つ1つ解説しておくと
kinect はいいでしょう、インスタンスを得るためのおまじない。
cReader はカラーデータを取得するためのおまじない。
cDesc はカラーフレームソースの定義情報を得るためのおまじない。
cBuff はカラーデータを入れる領域を確保してるわけだけど、自分は最初「4」ってなんやねんって思った。
これは色情報が1ピクセル/4バイトだから1920*1080の画角にはその4倍のバイトデータがあるってことだね、そりゃそうだね。
wBitmap はまぁそのまま、描画する大きさをちゃんと定義すればおk。

定義が済んだらこれらを操作するプロシージャを用意する。
cReader.FrameArrived += cReader_FrameArrived;

こうすることでColorFrameReaderが毎フレームデータを取得してくるので
その度にフレームごとの操作をしてあげればよい。

KinectをOpenするのを忘れずに。
Kinect.Open.();

ここまで通して書くとこうなる。
public MainWindow()
{
InitializeComponent();
this.Loaded += MainWindow_Loaded;

kinect = KinectSensor.GetDefault();
cReader = kinect.ColorFrameSource.OpenReader();
cDesc = kinect.ColorFrameSource.FrameDescription;
cBuff = new byte[cDesc.Width * cDesc.Height * 4];
wBitmap = new WriteableBitmap(cDesc.Width, cDesc.Height, 96.0, 96.0, PixelFormats.Bgra32, null);

cReader.FrameArrived += cReader_FrameArrived;
}

private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
kinect.Open.();
}

private void cReader_FrameArrived(object sender, ColorFrameArrivedEventArgs e)
{

}


さて、思ったより長くなったので次回へ続く・・・笑
(捕捉)
kinect.Openのところですが、Exciteブログの仕様なのか
Openメソッドとして記述するとエラーが起こり投稿出来ませんでした。
多分jsの記述とバッティングするのを防ぐためだろうけど。
エスケープかなんかすればいいんだろうけど調べるのがめんどいので
Openと()の間にドットを入れてます。

[PR]
by onigirism | 2015-08-25 11:34 | Kinect | Comments(0)
<< ColorFrameReade... 修飾子「this」の必要性 >>