0

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 ファイルです。改名しただけです。

ご協力いただきありがとうございます

4

2 に答える 2

0

VGA 解像度の深度と RGB の読み取りに問題があり、同じタイムアウト エラーが発生します。深度または RGB の解像度を vga の 4 分の 1 に下げると、すべてが機能します。

于 2014-01-23T17:07:11.940 に答える
0

なんでそんなに複雑にするの?そのためにAndroid ライブラリを使用できます。

于 2013-03-06T13:27:29.913 に答える