2017-10-12 6 views
0

J'écris un module qui estime le flux optique. A chaque pas de temps, il consomme un vecteur std :: où chaque élément du vecteur est un emplacement de pixel courant et un emplacement de pixel précédent. Le vecteur n'est pas commandé. Les nouveaux pixels qui auparavant n'étaient pas visibles seront présents et les emplacements de flux qui n'auront pas été trouvés disparaîtront. Existe-t-il une méthode correcte pour faire correspondre les éléments du nouveau vecteur avec l'ensemble des emplacements de flux optiques estimés?éléments de correspondance entre deux vecteurs std ::

Les vecteurs sont de l'ordre de 2000 éléments.

Ce sont les approches que je envisage:

  • itérer naïvement par le nouveau vecteur pour chaque emplacement de flux optique estimé
  • itérer naïvement par le nouveau vecteur, mais la suppression de chaque emplacement adapté de sorte que la recherche devient plus rapide que il continue
  • exécutez std :: sort sur ma liste et la nouvelle liste à chaque pas de temps. Puis itérer à travers le nouveau vecteur en commençant par le dernier index correspondant +1

Je soupçonne qu'il existe une façon acceptée de faire cela, mais je n'ai pas de formation compi sci.

Je suis en C++ 11 si cela est pertinent.

// 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

du code s'il vous plaît? [mcve] –

+1

@holmeski - pas sûr de comprendre mais ... es-tu sûr qu'à la place un 'std :: vector',' std :: set' (ou 'std :: multi_set') n'est pas meilleur pour toi ? – max66

+1

Vous feriez mieux de l'exprimer en termes de données pures. Il n'y a pas de concept de flux optique en C++. Donc vous ne pouvez pas en avoir un vecteur. Vous devez modéliser les données du monde réel en types C++, puis expliquer ce que vous voulez exactement extraire de ces deux vecteurs. EDIT: votre fonction n'a pas de sens. Il n'accepte que 'new_flow', où est' old_flow'? – luk32

Répondre

0

Je ne sais pas à comprendre ce que vous avez besoin, mais, en supposant que votre Matcher est construit avec un vecteur d'entier, qu'il y ins't importante de l'ordre et que vous avez besoin de vérifier ce vecteur avec d'autres vecteurs (méthode matchOpticalFlowNaive()) de faire quelque chose quand il y a un match, je suppose que vous pouvez écrire quelque chose comme suit

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 */ ; 
     } 
    } 
}; 

où l'objet Matcher est construit avec un vecteur qui est utilisé pour initialiser un std::set (ou un std::multi_set, ou un ensemble non ordonné/multiset?) pour simplifier le travail dans matchOpticalFlowNaive()