我嘗試使用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文件。我只是重新命名了它。
感謝您的幫助
我需要oni文件格式。創建的oni文件應該使用需要oni文件作爲輸入的現有庫進行處理。我認爲這個庫不支持oni,或者我已經讀過它了? – hami 2013-03-06 13:39:13