2012年3月10日土曜日

Xtionで画像を作ってみる

XtionでDepthGeneratorで深度を取得できますが、
カメラ的に使うにはImageGeneratorを使用します。

今回はJavaで取得してみます。


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

0 件のコメント: