XtionでDepthGeneratorで深度を取得できますが、 カメラ的に使うにはImageGeneratorを使用します。 今回はJavaで取得してみます。設定値実はここではまりました。。。とConfigに記述しておきます。 画面を指定してない場合、320x240で取得できます。 なんでハマったかというと 描画する予定の画面(640x480)に対して、 320x240のデータを埋め込んでしまった為、うまく描画できないという 現象に引っかかったからです。 なので作成する画像が320x240の場合は指定しなくてもOKです。
- <Node type="Image" stopOnError="false" >
- <Configuration>
- <MapOutputMode xRes="640" yRes="480" FPS="30"/>
- </Configuration>
- </Node>
画像データの作成でインスタンスを取得。 描画処理等の永久ループの箇所に
- imageGen = ImageGenerator.create(context);
という風にbyte[]を作成します。 imageMapにある値はwidth*height*3になります。 *3の値はRGBを表しています。 表示する際には深度の時と同じように
- ImageMetaData imageMD = imageGen.getMetaData();
- ImageMap imageMap = imageMD.getData();
- ByteBuffer image = imageMap.createByteBuffer();
- while ( image.remaining() > 0 ) {
- int pos = image.position();
- byte pixel = image.get();
- imgbytes[pos] = pixel;
- }
となります。 (gは画面上にあるpaint用のGraphicsオブジェクトです) これでカメラのように画像を出力する事が可能です。 ( ー`дー´)キリッ。。。もちろん動きますよ。
- DataBufferByte dataBuffer = new DataBufferByte(imgbytes, width*height*3);
- WritableRaster raster = Raster.createInterleavedRaster(dataBuffer, width, height, width * 3, 3, new int[]{0, 1, 2}, null);
- ColorModel colorModel = new ComponentColorModel(
- ColorSpace.getInstance(ColorSpace.CS_sRGB),
- new int[]{8, 8, 8},
- false,
- false,
- ComponentColorModel.OPAQUE,
- DataBuffer.TYPE_BYTE);
- bimg = new BufferedImage(colorModel, raster, false, null);
- g.drawImage(bimg, 0, 0, null);
例えば私のアプリはWebSocketと連携させているので この画像データをそのままWebSocketで送ってみようと思っています。 しかしそれはXtionとはあまり関係ないので 例えばですが1枚無人の背景データを用意してみて、 人間として認識された部分を背景データと重ねて塗りつぶす。 というプレデターごっこ(おそらくある程度マージンがあるので微妙に人の形が浮かび上がる)等が できるかなぁ。。。と思っています。 Depthとかの話とか書いてないから何か微妙な説明になるかなぁ、、、 もう少し、Generator周りとかがかっこよくなったら、記述したいと思います。
2012年3月10日土曜日
Xtionで画像を作ってみる
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿