2017-10-12 122 views
0

我在寫一個估計光流的模塊。在每個時間步它消耗一個std ::向量,其中向量的每個元素是當前像素位置和前一個像素位置。矢量不是有序的。先前未見過的新像素將出現,未找到的流動位置將消失。是否有正確的方法將新矢量中的元素與估計的一組光流位置進行匹配?兩個std :: vectors之間的匹配元素

這些向量大約是2000個元素。

這是我正在考慮的方法:

  • 通過每個估計光流的位置
  • 天真地通過新的向量迭代的新載體天真地重複,但刪除每個匹配的位置,這樣的搜索變得更快它繼續
  • 運行std ::排序在我的列表和每個時間步驟的新列表。然後遍歷從最後一個匹配索引開始的新向量+1

我懷疑有一種可以接受的方式去做這件事,但我沒有任何補習sci訓練。

我在C++ 11中,如果這是相關的。

// each element in the new vector is an int. I need to check if 
// there are matches between the new vec and old vec 
void Matcher::matchOpticalFlowNaive(std::vector<int> new_vec) 
{ 
for(int i = 0; i < this->old_vec.size(); i++) 
    for(int j =0; j < new_vec.size(); j++) 
     if(this->old_vec[i] == new_vec[j]){ 
      do_stuff(this->old_vec[i], new_vec[j]) 
      j = new_vec.size(); 
     } 
} 
+0

請問一些代碼? [mcve] –

+1

@holmeski - 不確定要理解,但是...你確定,而不是'std :: vector','std :: set'(或者'std :: multi_set')對你並不好? – max66

+1

你最好用純數據來表達它。在C++中沒有光流的概念。所以你不能擁有它的一個向量。您需要將真實世界的數據建模爲C++類型,然後解釋您想從這兩個向量中提取的內容。編輯:你的功能沒有意義。它只接受'new_flow','old_flow'在哪裏? – luk32

回答

0

不是一定要了解你需要什麼,但是,假設你Matcher構造與整數的矢量,有ins't重要的訂單,你需要檢查與其他載體中,這種載體(方法matchOpticalFlowNaive() )做一些事情時,有一場比賽,我想你可以按照如下

struct Matcher 
{ 
    std::set<int> oldSet; 

    Matcher (std::vector<int> const & oldVect) 
     : oldSet{oldVect.cbegin(), oldVect.cend()} 
    { } 

    void matchOpticalFlowNaive (std::vector<int> const & newVec) 
    { 
     for (auto const & vi : newVec) 
     { 
     if (oldSet.cend() != oldSet.find(vi)) 
      /* do something */ ; 
     } 
    } 
}; 

其中Matcher對象構造與用來初始化std::set(或std::multi_set或無序集向量寫的東西/ multiset?)來簡化工作在matchOpticalFlowNaive()

相關問題