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