2017-10-12 100 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()