ダメだ…
もう、なんでか分からない(T_T)

ちゃんとプログラミング言語を丁寧にお勉強し直すべきなのは分かっているけど、それに時間があんまり割けていないので結局、付け焼き刃。。。

みんな、なんでコンピューターが得意になれるの???(T_T)

基本的(と思われること)を知らずに分からずにやっているから、つまづくと大惨事だよ…


うーん。
KINECT (for WIndows) v2になってからColorFrameとDepthFrameのサイズが違っているので、今までいかにいい加減に作っていたかが、ありありしてしまうわ。

DepthFrameの距離を取るのは簡単なのよね。
CopyFrameDataToArrayを使えばushortの配列にパラッと入れてもらえるので。

できないのが、ColorFrameとDepthFrameの対応した部分を抜き出すとこ。
CoordinateMapperの中のMapColorFrameToDepthSpaceでDepthSpacePointで定義した配列の中にColorFrameの座標に対応したdepthデータが入ってくれると思うんだけど…
いざ、参照しようとすると中身は全部-Infinity。。。

-Infinityが入っているところはそのcolor pixelに対応したdepth pixelがありません。ってことらしいんだけど、全部のcolor pixelに対応しているデータがないんじゃないかと思わせるほど、-Infinity続出。
欲しいcolor pixelを含んだ周りの9 pixels(3x3)で対応するdepthの値を探してもないし…

要領のいいプログラミングが分からないため、あんまり検索すると処理が遅くなって映像がカクカクし始めるし…(~_~;;;

KINECTのサンプルプログラムを探したらWPF版のCoodinateMappingBasicsで、ColorFrameと DepthFrameの対応を取っていて、そこではLockImageBufferからの、直接DapthFrameのデータにアクセスするっていう方法が取られていた。

ImageBufferからポインタで取得?ってこと???
えー、どうしてMapColorFrameToDepthSpaceじゃダメなの?
これを使うにはどうしたらいいのー???

結局、数日、どうにかならないか、ぐちゃぐちゃやってみたものの、できず…泣

別にMapColorFrameToDepthSpaceにこだわらなきゃいけない理由がある訳じゃないので、サンプルの通りMapColorFrameToDepthSpaceUsingIntPtrを使ってみることに。

KinectSensor kinect;
DepthSpacePoint[] depthSpacePoints;
・・・
depthSpacePoints = new DepthSpacePoint[ColorFrameDesc.LengthInPixels];
・・・

KinectBuffer depthData = depthFrame.LockImageBuffer();
kinect.coordinateMapper.MapColorFrameToDepthSpaceUsingIntPtr(
depthData.UnderlyingBuffer,
depthData.Size,
depthSpacePoints);


depthFrameのImageBufferをロックしておいてDepthSpacePoint配列の中にデータ取り込みってことでいいのかな…
depthFrameをロックしちゃったら次ロック解除しないといけないんじゃないかと思うがどうしていいのかよく分からず…
とりあえずAcquireFrame()の直後に来る処理だからMapColorFrameToDepthSpaceUsingIntPtrの後にdepthFrame.Dispose()も加えてみた。
一応、動いてるね…良かったのかな。
なんかね、しかも未だにポインタとか配列とか分かってないんじゃない?私…って気がして震える…汗
大丈夫か、私ぃ(T_T)

でも、これを使ってみたらあっさりとdepthSpacePointsからデータが取り出せるようになりました。
欲しいColorFrameの座標を(X1,Y1)、それに対応したDepthFrameの座標を(X2,Y2)とすると

float X1,Y1,X2,Y2;

int Point = X1 + Y1 * colorFrameDesc.Width;
X2 = depthSpacePoints[Point].X;
Y2 = depthSpacePoints[Point].Y;

ってやったら、もっともらしいデータが出てきてたので、きっと合ってると思ふ。


しかし、ぱっと見は尤もらしいんだが、ちゃんとデータ取って確認してみたら変かもしれぬので、まだ安心はできないな…没
自分のプログラムがあってるか間違ってるか、判断できないほどへっぽこなんでやんす、わたくし。


まだ他にもいまいちよく分からないことがあるんだよね…

逆に、対象範囲になるdepthを持っているピクセルに対応したColorFrameの座標に色をつけたら、どうも表示がずれちゃうの…
(depthが90cmから110cmのところにだけグラデーションでカラーを表示させるとカメラ画像に綺麗に重ならずずれる)

まあ、それは描画だけの問題なので、即解決できないと測定もできない。って状況じゃないからマシだけど。
(でも、表示がおかしいのは気になるので、なるべく早く直そう)


とりあえず、これで骨格も色マーカー追尾も両方できるようになったので、あとはIRカメラが長時間使用した時に座標変化とかしないかどうか測定してみなくては。


(もし、うっかり何かの検索でこの記事にひっかかり、上述のプログラムがよく知りたいという方はKINECT Browser v2.0からCoordinateMappingBasicsのサンプルをダウンロードして確認してみてくださいね^^;;)