2013-03-06 51 views
0

我嘗試使用Java記錄oni文件。當我錄製一個文件時效果很好。但是當我想記錄幾個文件時,我遇到了問題。無法重新記錄oni文件

下面是一些測試代碼:

package test; 

import org.OpenNI.Context; 
import org.OpenNI.DepthGenerator; 
import org.OpenNI.GeneralException; 
import org.OpenNI.ImageGenerator; 
import org.OpenNI.OutArg; 
import org.OpenNI.RecordMedium; 
import org.OpenNI.Recorder; 
import org.OpenNI.ScriptNode; 

public class RecorderProblems { 

    private static final String SAMPLE_XML_FILE = "KinectConfig.xml"; 
    private static final String TEST1_ONI_FILE = "Test1.oni"; 
    private static final String TEST2_ONI_FILE = "Test2.oni"; 

    public static void main(String[] args) { 
     Context context = null; 
     DepthGenerator depthGenerator = null; 
     ImageGenerator imageGenerator = null; 
     try { 
      OutArg<ScriptNode> scriptNode = new OutArg<ScriptNode>(); 

      // Init Hardware 
      System.out.println("Init Hardware"); 
      context = Context.createFromXmlFile(SAMPLE_XML_FILE, scriptNode); 
      depthGenerator = DepthGenerator.create(context); 
      imageGenerator = ImageGenerator.create(context); 
      context.startGeneratingAll(); 

      // Record 1 
      System.out.println("Start Record 1"); 
      Recorder recorder = Recorder.create(context, "oni"); 
      // Adding next line produces a corrupt file, but the program runs fine 
//   context.createProductionTree(recorder.getInfo()); 
      recorder.setDestination(RecordMedium.FILE, TEST1_ONI_FILE); 
      recorder.addNodeToRecording(depthGenerator); 
      recorder.addNodeToRecording(imageGenerator); 
      for (int i = 0; i < 100; i++) { 
       context.waitOneUpdateAll(imageGenerator); 
       recorder.Record(); 
      } 
      recorder.removeNodeToRecording(depthGenerator); 
      recorder.removeNodeToRecording(imageGenerator); 
      recorder.dispose(); 

      // Record 2 
      System.out.println("Start Record 2"); 
      recorder = Recorder.create(context, "oni"); 
      // Adding next line produces a corrupt file, but the program runs fine 
//   context.createProductionTree(recorder.getInfo()); 
      recorder.setDestination(RecordMedium.FILE, TEST2_ONI_FILE); 
      recorder.addNodeToRecording(depthGenerator); 
      recorder.addNodeToRecording(imageGenerator); 
      for (int i = 0; i < 100; i++) { 
       context.waitOneUpdateAll(imageGenerator); 
       recorder.Record(); 
      } 
      recorder.removeNodeToRecording(depthGenerator); 
      recorder.removeNodeToRecording(imageGenerator); 
      recorder.dispose(); 
     } catch (GeneralException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } finally { 
      // End Hardware 
      System.out.println("End Hardware"); 
      depthGenerator.dispose(); 
      depthGenerator = null; 
      imageGenerator.dispose(); 
      imageGenerator = null; 
      context.release(); 
      context.dispose(); 
     } 
    } 
} 

當我嘗試設置目的地的第二個記錄我拿到StatusException「輸入指針爲空」。

如果我添加未註釋的行,程序運行良好,但創建的oni文件不可讀。 (我不知道這條線究竟是什麼)

我也嘗試重新初始化上下文。起初這工作得很好,但是當我試圖記錄幾個文件時,我在重新初始化時也遇到了問題。下面是一些示例代碼:

package test; 

import org.OpenNI.Context; 
import org.OpenNI.DepthGenerator; 
import org.OpenNI.GeneralException; 
import org.OpenNI.ImageGenerator; 
import org.OpenNI.OutArg; 
import org.OpenNI.RecordMedium; 
import org.OpenNI.Recorder; 
import org.OpenNI.ScriptNode; 

public class RecorderProblems { 

    private static final String SAMPLE_XML_FILE = "KinectConfig.xml"; 

    public static void main(String[] args) { 
     Context context = null; 
     DepthGenerator depthGenerator = null; 
     ImageGenerator imageGenerator = null; 
     try { 
      OutArg<ScriptNode> scriptNode = new OutArg<ScriptNode>(); 

      // Record 1 
      for (int i = 0; i < 25; i++) { 
       System.out.println("Run " + i); 
       // Init Hardware 
       System.out.println("Init Hardware " + i); 
       context = Context 
         .createFromXmlFile(SAMPLE_XML_FILE, scriptNode); 
       depthGenerator = DepthGenerator.create(context); 
       imageGenerator = ImageGenerator.create(context); 
       context.startGeneratingAll(); 

       System.out.println("Start Record " + i); 
       Recorder recorder = Recorder.create(context, "oni"); 
       recorder.setDestination(RecordMedium.FILE, "test_" + i + ".oni"); 
       recorder.addNodeToRecording(depthGenerator); 
       recorder.addNodeToRecording(imageGenerator); 
       for (int j = 0; j < 100; j++) { 
        context.waitOneUpdateAll(imageGenerator); 
        recorder.Record(); 
       } 
       recorder.removeNodeToRecording(depthGenerator); 
       recorder.removeNodeToRecording(imageGenerator); 
       recorder.dispose(); 

       System.out.println("End Hardware " + i); 
       depthGenerator.dispose(); 
       depthGenerator = null; 
       imageGenerator.dispose(); 
       imageGenerator = null; 
       context.release(); 
       context.dispose(); 
      } 

     } catch (GeneralException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

第三次運行時,我得到一個StatusExcption「等待新數據時發生超時!」。

有沒有人記錄文件的經驗?我不知道,我是否使用了錯誤的庫,或者這是OpenNI(帶有Java)的問題?

順便說一句,我使用OpenNI 1.5.2.23和Kinect相機。 XML配置文件「KinectConfig.xml」是OpenNI示例隨附的默認XML文件。我只是重新命名了它。

感謝您的幫助

回答

0

你爲什麼這麼複雜? 您可以使用Android libraries

+0

我需要oni文件格式。創建的oni文件應該使用需要oni文件作爲輸入的現有庫進行處理。我認爲這個庫不支持oni,或者我已經讀過它了? – hami 2013-03-06 13:39:13

0

我有閱讀VGA分辨率深度和RGB投注相同的超時錯誤的問題。如果我減少深度或rgb到季度vga的分辨率,一切正常。