0

フレームごとに ByteBuffer を受け取るカメラがあります。ByteBuffer から 640px x 480px の 11 ビット グレースケール イメージを抽出し、短い [640][480] に保存します。これを行うのは、画像として必要としないためです。これはより高速になると思いました (間違っている場合は修正してください)。

現在、これは 1 秒間に約 30 回行われています。各フレームで、プログラムは現在のピクセルの既存の値よりも 20 を超えて小さい値をそのピクセルの値に保存します。私の短い[640] [480]で効果的に背景画像を作成します。

問題は、カメラが動いて背景が変わる可能性があることです。そして、動いていないカメラから取得した背景は、フレームごとにすでに大きく変化しています (これもかなりのマージンがあります)。実際には、大きな前景オブジェクトを抽出するのに十分なだけ安定しています. そのため、カメラと画像がどれだけシフトしたかを教えてくれるアルゴリズムが必要です。そのため、画像のどの領域が新しく、どの領域がまだ使用可能であるかを知ることができます。

私が考えることができる唯一の方法は、可能なシフトごとに画像をスキャンし、どれが最もよく一致するかを確認することでした. これについてもっと良い方法はありますか?この方法では、画像全体をフレームごとに約 120 万回スキャンする必要があるため...

さらに、処理、openCV、またはそのようなライブラリは使用しません。

編集:かなり重要な詳細について言及するのを忘れていました。画像は深度マップであるため、照明は影響しません。

編集:ここにいくつかのコードがあります。私は Open Kinect ライブラリを使用して、Kinect から深度マップを取得します。情報を解析する方法はまだわかりません。これが、これまでのところ機能する唯一の方法です。

public static short[][] background = new short[640][480];

public void onFrameReceived(FrameMode format, ByteBuffer frame, int timestamp) {

    for(int n=0; n<frame.limit()/2; n++) {

        int index = n*2;
        short Gray = (0xff - frame.get(index) & 0xff) | ((3-frame.get(index+1) & 0x3) * 255);

        short x = n%640;
        short y = n/640;

        if(background[x][y] > Gray + 10 || background[x][y] == 0) {
            background[x][y] = Gray;
        }
    }
}

フレームごとに 2 バイトを取得し、そこからオブジェクトが kinect からどれだけ離れているかを表す 11 ビット値を抽出しようとします。他にどうすればいいのかわかりませんが、このように機能するので、その質問は後で保存します。

追加情報: frame.limit() はバイトバッファ内のバイトの量です。frame.get は、バイトバッファから 1 バイトを取得します。何らかの理由で、kinect がバイトを逆順に送信してきます...

4

2 に答える 2