0

私の問題をできる限り説明しようと思います。2 つのリストがあり、1 つはオーディオ フレーム、もう 1 つはカラー フレーム (関係ありません) です。どちらにもタイムスタンプがあり、同じ瞬間にキャプチャされましたが、異なる瞬間にキャプチャされました。だから、私はこのようにしています:

index  COLOR  AUDIO
0      841    846
1      873    897
2      905    948
3      940    1000
...     ...    ...

フレームはキャプチャされてから特定の部分にトリミングされたため、高い数値で開始されますが、私が撮影したフレーム 0 はわずか 5 ミリ秒間隔で同期されています (タイムスタンプはミリ秒)。

私が持っているすべてのケースで、オーディオフレーム数は色数よりも少なくなっています。それらを同じ数にする必要があります。開始フレームは color>audio、color の場合があります

編集: 各リストに 4 つ以上のフレームがあります。フレーム間の時間は一定ではありません。

edit2: これは kinect を使用してキャプチャされましたが、関係ないと思いますが、データを再度キャプチャすることはできません

edit3: 時刻を同期する必要がある理由を尋ねられました。私はこれを使用してマルチモーダル感情認識システムを開発しており、意思決定レベル分類子 (KNN) をトレーニングする必要があるため、2 つの分類子の入力データを同じ瞬間に一致させる必要があります。持っていないフレームに「ゼロ」データを供給することはできません。

EDIT4:私の問題と私がより良くしたいことを説明しようとしています:フレーム、オーディオ、カラーの2つのリストがあります。どちらも同じ長さの録音に対応します。たとえば、どちらも 5 秒の録音を「記述」します。問題は、色のサンプルよりもオーディオのサンプルが少ないことです(サンプリングレートのため)。ここで、これらのフレーム、音声、色をマルチモーダル分類器に入力する必要があります。シンフは、どのカラーフレームがオーディオフレームに対応するかを知る必要があるため、分類する「単一フレーム」として分類器に送信できます。リストのオーディオのどのインデックスがリストの色の他のインデックスに対応するかわからないため、それはできません(逆も同様です)。だから私がやろうとしているのは、小さいリスト (オーディオ) を大きいリスト (色) と同じ数に拡張することです。そのためには、いくつかのオーディオ フレームを複製する必要があります。私の問題はこれを修正することです。複製するのに最適なフレームをどのように知ることができますか? タイムスタンプはありますが、アルゴリズムを自動的にソートするのに問題があります。

4

1 に答える 1

1

オーディオ フレームを (時間的に) 最も近いカラー フレームに揃えることができると思います。

void align(long[] colorTimes, ColorFrame[] colorFrames,
           long[] audioTimes, AudioFrame[] audioFrames)
{
    assert colorTimes.length == colorFrames.length;
    assert audioTimes.length == audioFrames.length;
    assert audioTimes.length <= colorTimes.length;

    // We assume all times and frames are sorted.
    // Otherwise you can sort them here.

    int lastAlignedColorIndex = -1;

    for (int index = 0; index < audioTimes.length; index++) {
        int timeToAlign = audioTimes[index];
        int alignedIndex = lastAlignedColorIndex + 1;

        int colorIndex = lastAlignedColorIndex + 2;
        while (colorIndex < colorTimes.length) {
            if (colorTimes[alignedIndex] > timeToAlign)
                break;

            int timeDiff = Math.abs(colorTimes[colorIndex] - timeToAlign);
            if (timeDiff < Math.abs(colorTimes[alignedIndex] - timeToAlign))
                alignedIndex = colorIndex;

            colorIndex++;
        }

        enterData(colorFrames[alignedIndex], audioFrames[index]);

        lastAlignedColorIndex = alignedIndex;
    }
}
于 2013-10-24T16:07:15.177 に答える