2016-09-13 10 views
1

RGB-Dカメラとテキストファイルでデータセットを取得しました。ここで、データセットの各イメージに対して、タイムスタンプとファイル名が格納されています。私が行うのは、このファイルを解析し、2つのstd :: mapを埋め、1つはrgbイメージ用、もう1つは深度イメージ用です。今、タイムスタンプが交差しないので、私はタイムスタンプに基づいて一致するイメージを見つけるルーチンを書く必要があります。これは私が今までに書いたものです:2つのstd :: map間のマッチを見つけるC++の効率的な方法

typedef map<double,string> StampImageMap; 

... 

vector<string> &vstrImageFilenamesRGB; 
vector<string> &vstrImageFilenamesD; 
vector<double> &vTimestampsRGB; 
vector<double> &vTimestampsDPT; 

double tolerance = 0.02; 

for(StampImageMap::iterator it=rgb_images.begin(); it != rgb_images.end(); it++) { 
     bool found = false; 
     StampImageMap::iterator jt=depth_images.begin(); 
     while(found == false && jt!=depth_images.end()) { 
      if(fabs(it->first - jt->first) < tolerance) { 
       found = true; 
       vstrImageFilenamesRGB.push_back(it->second); 
       vstrImageFilenamesD.push_back(jt->second); 
       vTimestampsRGB.push_back(it->first); 
       vTimestampsDPT.push_back(jt->first); 
      } 
      jt++; 
     } 
    } 

このタスクを実行するより効率的な方法があるのでしょうか?

+0

あなたはRGBとDタイムスタンプのための1対1の関係を持っていますか:ここで

、この場合の擬似コードのですか?彼らは固定されたルールに従っていますか? RGBタイムスタンプは、同じ画像のDタイムスタンプよりも常に小さいですか? –

+0

はいカメラのフレームレートは30Hzなので、対応するRGBとDEPTH画像は同じタイムスタンプを持つことはできませんが(明らかな理由により)、その差は1/33を超えることはできません。そのため、 。 –

+0

@FedericoNardiシーケンスが「完全」(1つでもギャップもない)で、1対1の場合、最も古いマッチを見つけて順番にペアにすることはできませんか? (つまり、最初の深度画像を持つ最初のrgb画像、2番目の深度画像を持つ最初のrgb画像など) – molbdnilo

答えて

2

コードは現在書かれているように、複雑さがΘ(N M)であるNメートルは、配列の大きさです。これを改善するには、少なくとも2つの方法があります(2番目は効率的ですが、コード化が難しい)。外側のループの本体で

  • while(found == false && jt!=depth_images.end())を介して第2のマップのすべての要素の上にないループを行います。代わりに、it->first - toleranceit->first + toleranceをそれぞれ検索するには、std::map::lower_boundstd::map::upper_boundを使用してください。この2つの呼び出しの結果の間だけをループします。

    for(StampImageMap::iterator it=rgb_images.begin(); it != rgb_images.end(); it++) { 
        StampImageMap::const_iterator lower = depth_images.lower_bound(it->first - tolerance); 
        StampImageMap::const_iterator upper = depth_images.lower_bound(it->first + tolerance); 
    
        // Now just search between lower and upper. 
    } 
    

    これはPこの範囲の大きさであるΘ(ログ(M))+ Pに各反復を減少させる。

    したがって、コードは次のようになります。

  • マップのキーがソートされているので、standard technique of finding the intersection of two sorted arraysをこのケースに変更することができます。これにより、実行時間がΘ(m + n)に減少します。正確な要素の交差点を見つけようとしているのではなく、「十分に近い」要素の交差点を見つけようとしているので、この変更はややこしいことに注意してください。

    it = rgb_image.begin(); 
    jt = depth_image.begin(); 
    
    while(it != rgb_image.end() && jt != depth_image.end()) { 
        if(fabs(it->first - jt->first) < tolerance) { 
         // Match found! 
         ++it; 
         ++jt; 
         continue; 
        } 
    
        if(it.first > jt.first + tolerance) { 
         ++jt; 
         continue; 
        } 
    
        ++it; 
    } 
    
+0

許容範囲内で比較を処理する特別なコンパレータを作成する必要があります(簡単です。すでにOPコードで実行されています) - 推移的ではありませんが、マップ内のすべての値が対象となります。これが重要です。また、必要なことを行う特別な出力イテレータがあれば、簡単に標準ライブラリを使用できます。 –

+0

@Revolver_Ocelotそうです、それは良い考えです。しかし、細部に忍耐がある場合、2番目のものは複雑さが低く、標準ライブラリアルゴリズムがあるかどうかはわかりません(比較ファンクタについての正確な点もあります)。 –

+0

ああ、両方のマップから値が必要なので、set_intersectionを使用できないことに気付きました。後でもう一度ループを繰り返すことはできますが、アルゴリズムはO(nm)よりはるかに遅いため、基本的にはset_intersectionですが、両方の値を一度に処理できます。 –

関連する問題