2011-12-03 5 views
1

誰がOpenCVのでJavaとの組み合わせでopenniを使用することができた場合、私は不思議でしたか? たとえば、IplImageなどで奥行きストリームを取得しています...私は現在これをやろうとしていますが、どこから開始するのかはわかりません。のJava:OpenCVの&openni

これを行った人が知識やコードを共有したいと思う人は、感謝します。これまで

マイコード:

/

* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 


/** 
* 
* @author olivierjanssens 
*/ 

package kitouch; 

import com.googlecode.javacpp.Loader; 
import com.googlecode.javacv.*; 
import com.googlecode.javacv.cpp.*; 
import static com.googlecode.javacv.cpp.opencv_core.*; 
import static com.googlecode.javacv.cpp.opencv_imgproc.*; 
import static com.googlecode.javacv.cpp.opencv_calib3d.*; 
import static com.googlecode.javacv.cpp.opencv_objdetect.*; 
import java.nio.ShortBuffer; 
import java.awt.*; 
import java.awt.image.*; 
import org.OpenNI.*; 
import javax.swing.JFrame; 

public class KiTouch { 

    private Context context; 
    private final String SAMPLE_XML_FILE = "/Users/olivierjanssens/Development/Kinect/OpenNI/Samples/Config/SamplesConfig.xml";  
    private OutArg<ScriptNode> scriptNode; 
    private DepthGenerator depthGen; 
    private BufferedImage bimg; 
    int width, height; 
    IplImage depthImage; 
    private float histogram[]; 
    private byte[] imgbytes; 
    CanvasFrame frame = new CanvasFrame("Some Title"); 

    public KiTouch() { 
     try { 
      scriptNode = new OutArg<ScriptNode>(); 
      context = Context.createFromXmlFile(SAMPLE_XML_FILE, scriptNode); 

      depthGen = DepthGenerator.create(context); 
      DepthMetaData depthMD = depthGen.getMetaData(); 

      histogram = new float[10000]; 
      width = depthMD.getFullXRes(); 
      height = depthMD.getFullYRes(); 

      imgbytes = new byte[width*height]; 

      DataBufferByte dataBuffer = new DataBufferByte(imgbytes, width*height); 
      Raster raster = Raster.createPackedRaster(dataBuffer, width, height, 8, null); 
      bimg = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY); 
      bimg.setData(raster); 
      depthImage = IplImage.create(width, height, IPL_DEPTH_8U, 1); 

     } catch (GeneralException e) { 
      e.printStackTrace(); 
      System.exit(1); 
     } 


    } 


    private void calcHist(DepthMetaData depthMD) 
    { 
     // reset 
     for (int i = 0; i < histogram.length; ++i) 
      histogram[i] = 0; 

     ShortBuffer depth = depthMD.getData().createShortBuffer(); 
     depth.rewind(); 

     int points = 0; 
     while(depth.remaining() > 0) 
     { 
      short depthVal = depth.get(); 
      if (depthVal != 0) 
      { 
       histogram[depthVal]++; 
       points++; 
      } 
     } 

     for (int i = 1; i < histogram.length; i++) 
     { 
      histogram[i] += histogram[i-1]; 
     } 

     if (points > 0) 
     { 
      for (int i = 1; i < histogram.length; i++) 
      { 
       histogram[i] = (int)(256 * (1.0f - (histogram[i]/(float)points))); 
      } 
     } 
    } 

    public Dimension getPreferredSize() { 
     return new Dimension(width, height); 
    } 

    void updateDepth() 
    { 
     try { 
      DepthMetaData depthMD = depthGen.getMetaData(); 

      context.waitAnyUpdateAll(); 

      calcHist(depthMD); 
      ShortBuffer depth = depthMD.getData().createShortBuffer(); 
      depth.rewind(); 

      while(depth.remaining() > 0) 
      { 
       int pos = depth.position(); 
       short pixel = depth.get(); 
       imgbytes[pos] = (byte)histogram[pixel]; 
      } 
      depthImage.createFrom(bimg); 
      frame.showImage(depthImage); 

     } catch (GeneralException e) { 
      e.printStackTrace(); 
     } 
    } 


} 

と、このコードを呼び出すために:私は黒のフレームを取得していますが

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package kitouch; 

import org.OpenNI.GeneralException; 

/** 
* 
* @author olivierjanssens 
*/ 
public class kiTouchApp { 
    public static void main(String s[]) throws GeneralException { 
     KiTouch kit = new KiTouch(); 


      while(true) { 
      kit.updateDepth(); 
     } 
    } 
} 

。だから、それはまだdoens't仕事

私はここで行うようにIplImageを初期化していないが、ちょうどIplImage depthImage =新しいIplImage();このエラーが表示されます:

Exception in thread "main" java.lang.NullPointerException 
at java.awt.image.BufferedImage.<init>(BufferedImage.java:613) 
at com.googlecode.javacv.cpp.opencv_core$IplImage.getBufferedImage(opencv_core.java:1005) 
at com.googlecode.javacv.cpp.opencv_core$IplImage.getBufferedImage(opencv_core.java:931) 
at com.googlecode.javacv.CanvasFrame.showImage(CanvasFrame.java:331) 
at kitouch.KiTouch.paint(KiTouch.java:138) 
at kitouch.kiTouchApp.main(kiTouchApp.java:21) 

Thxを先に入力してください。

答えて

1

私はOpenNIとJavaと遊ぶが、Processingを使用して、私のささやかなニーズのために、現時点ではうまく動作可能なラッパー(SimpleOpenNIOpenCV)でした。このOpenCVのラッパーは、OpenCVの1.0使用しても、あなたはむしろ処理ライブラリを使用して、独自のJavaクラスを使用する場合がありますことを

import hypermedia.video.*; 
import SimpleOpenNI.*; 

SimpleOpenNI ni; 
OpenCV cv; 
PImage user; 
void setup() 
{ 
    ni = new SimpleOpenNI(this); 
    ni.enableScene(); 
    background(200,0,0); 
    strokeWeight(4); 
    size(ni.sceneWidth() , ni.sceneHeight()); 
    cv = new OpenCV(this); 
    cv.allocate(width,height); 
} 
void draw() 
{ 
    //OpenNI 
    ni.update(); 
    user = ni.sceneImage(); 
    //OpenCV 
    cv.copy(user); 
    cv.blur(OpenCV.BLUR, 17); 
    Blob[] blobs = cv.blobs(width,height, OpenCV.MAX_VERTICES, true, OpenCV.MAX_VERTICES*4); 

    //diplay 
    image(cv.image(),0,0); 
    //* 
    fill(255); 
    for(Blob b : blobs){ 
    beginShape(); 
     for(java.awt.Point p : b.points) vertex(p.x,p.y); 
    endShape(CLOSE); 
    } 
    //*/ 
} 

注: は、ここでは非常に基本的な例です。この場合は、JavaCVラッパーを試してください。 深度ストリームに関しては、OpenNIに付属のorg.OpenNI.Samples.SimpleViewerクラスを見ると、OpenNIの深度バイトがBufferedImageに書き込まれていることがわかります。これはOpenCVなどと統合できると思います。

public SimpleViewer() { 

     try { 
      scriptNode = new OutArg<ScriptNode>(); 
      context = Context.createFromXmlFile(SAMPLE_XML_FILE, scriptNode); 

      depthGen = DepthGenerator.create(context); 
      DepthMetaData depthMD = depthGen.getMetaData(); 

      histogram = new float[10000]; 
      width = depthMD.getFullXRes(); 
      height = depthMD.getFullYRes(); 

      imgbytes = new byte[width*height]; 

      DataBufferByte dataBuffer = new DataBufferByte(imgbytes, width*height); 
      Raster raster = Raster.createPackedRaster(dataBuffer, width, height, 8, null); 
      bimg = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY); 
      bimg.setData(raster); 

     } catch (GeneralException e) { 
      e.printStackTrace(); 
      System.exit(1); 
     } 
    } 
+0

現在、私はBufferedImageを調べています。私は、BufferedImageをIplImageに変換できると信じています。ああ、btw私はjavacvを使用しています – Ojtwist

+0

確かに、** Javaのiplimageのためのグーグル**あなたが[興味深い結果]を取得する必要があります(http://www.morethantechnical.com/2009/05/14/combining-javas-bufferedimage- and-opencvs-iplimage /)を使用します。 –

+0

本当ですが、私は試みた組み込みの変換があります: 'depthImage.createFrom(bimg); frame.showImage(depthImage); ' updatedepth関数ではどのようにしますか?しかし、私はnullpointerを得る。だから、検索を続ける必要があります – Ojtwist

関連する問題