Javaでoniファイルを記録しようとしています。1つのファイルを記録するとうまくいきます。しかし、複数のファイルを記録したい場合、問題が発生します。
ここにいくつかのテストコードがあります:
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();
}
}
}
2 番目のレコードの宛先を設定しようとすると、StatusException "Input pointer is null" が発生します。
コメントを外した行を追加すると、プログラムは正常に実行されますが、作成された 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();
}
}
}
3 回目の実行で、「新しいデータを待っているときにタイムアウトが発生しました!」という StatusExcption が表示されました。
ファイルの記録を経験した人はいますか? ライブラリの使い方が間違っているのか、それとも OpenNI (with Java) の問題なのかわかりません。
ちなみに、OpenNI 1.5.2.23 と Kinect カメラを使用しています。XML 構成ファイル「KinectConfig.xml」は、OpenNI サンプルに同梱されているデフォルトの XML ファイルです。改名しただけです。
ご協力いただきありがとうございます