2017-10-12 10 views
0

광학 플로우를 추정하는 모듈을 작성 중입니다. 각 타임 스텝에서 벡터의 각 요소가 현재 픽셀 위치와 이전 픽셀 위치 인 std :: vector를 사용합니다. 벡터가 정렬되지 않았습니다. 이전에 표시되지 않은 새 픽셀이 표시되고 찾을 수없는 위치가 사라집니다. 새 벡터의 요소를 예상되는 옵티컬 플로 위치 집합과 일치시키는 올바른 방법이 있습니까?두 개의 std :: vectors 사이의 요소를 일치 시키십시오.

벡터는 2000 개 요소의 순서입니다.

  • 순진하게도
  • 는 순진 새로운 벡터를 반복 각각 추정 광학 플로우 위치에 대한 새로운 벡터를 반복하지만, 검색이 더 빠르게 얻을 수 있도록 각 일치하는 위치를 제거 :

    은 접근 내가 고려하고 있습니다 그것은
  • 내 목록에있는 std :: sort와 매 시간 단계마다 새 목록을 실행합니다. 그런 다음 마지막으로 일치하는 색인에서 시작하는 새 벡터를 반복합니다. +1

나는 받아들이는 방법이 있다고 의심 스럽지만 어떤 Comp Sci 훈련도받지 못했습니다.

관련성이 높은 경우 C++ 11입니다. 중요한 순서가 ins't 있고 다른 벡터와이 벡터 (방법 matchOpticalFlowNaive()을 확인해야한다는, 당신의 Matcher 정수의 벡터로 구성되어 있다고 가정하면,하지만 당신이 필요합니까 이해하기

// 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 개체가 std::set (또는 std::multi_set, 또는 정렬되지 않은 집합을 초기화하는 데 사용되는 벡터로 구성되어

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

를 다음과 같이 뭔가를 쓸 수 있다고 생각/multiset?) 간단한 작업 만들기 in matchOpticalFlowNaive()