2014-05-01 6 views
3

OpenCV에서 FlannBasedMatcher을 사용하면 동일한 매개 변수로 정규 표현식을 호출하는 결과가 달라집니다. 누구든지 내가 뭘 잘못하고 있다고 제안 할 수 있니?FlannBasedMatcher가 다른 결과를 반환합니다.

아래의 코드가 나는 데 문제의 최소한의 예를 보여줍니다 -이 실제 코드 :

결과 출력 루프 주위 때마다해야되지 않습니다 - 나는이 FlannBasedMatcher 사용하는 방법이 대표를 단순화 동일하지만, 그렇지 않습니다. 나는 그것이 도움이 될 것입니다 (?) 생각하지 않지만

int const k = std::min(query_descriptors.rows, 
         std::min(train_descriptors.rows, 2)); 

    cv::Mat query_descriptors_original = query_descriptors.clone(); 
    cv::Mat train_descriptors_original = train_descriptors.clone(); 
    for (int loop=0; loop<2; ++loop) 
    { 
     cv::FlannBasedMatcher matcher; 
     matcher.add(std::vector<cv::Mat>(1, train_descriptors)); 

     std::vector<matches_t> knnMatches; 
     matcher.knnMatch(query_descriptors, knnMatches, k); 

     matches.clear(); 
     for (auto const &knn : knnMatches) 
     { 
      matches.push_back(knn[0]); 
      std::cout << knn[0].queryIdx << ',' << knn[0].trainIdx << '\n'; 
     } 
     std::cout << '\n'; 

     assert(cv::countNonZero(query_descriptors != query_descriptors_original) == 0); 
     assert(cv::countNonZero(train_descriptors != train_descriptors_original) == 0); 
    } 
} 

출력은,이다

0,27 
1,170 
2,100 
3,100 
4,123 
5,100 
6,191 
7,71 
8,191 
9,67 
10,27 
11,45 
12,302 
13,190 
14,248 
15,158 
16,262 
17,248 
18,211 
19,67 
20,248 
21,275 

0,2 
1,200 
2,224 
3,302 
4,130 
5,302 
6,191 
7,195 
8,191 
9,195 
10,200 
11,45 
12,248 
13,277 
14,248 
15,255 
16,262 
17,248 
18,182 
19,14 
20,54 
21,284 
+0

) (매칭을 찾기위한 OpenCV의 3.1) 할 때마다 다른 결과를 얻을 이유가 일치하는 임의의 함수를 사용한다는 것을 의미

는 이잖아. 이미지 스티칭 용. 3 개의 이미지를 사용하면 각 이미지 쌍에 대해 동일한 결과 집합을 제공합니다. 4 개의 이미지에 대해 동일한 코드를 실행하면 이전 종료 쌍에 대한 knn_matches가 변경되지만 각 재실행시에도 동일합니다. 이유를 설명해 주시겠습니까 –

답변

4

플란넬은 무작위 KD 트리 알고리즘과 만들 수있는 계층 K-의미 트리 알고리즘 중에서 선택 최적의 가장 가까운 이웃 근사. 알고리즘의 선택은 데이터 집합 구조 및 검색 정확도와 같은 여러 요소를 기반으로합니다. 각 알고리즘에는 검색 성능에 영향을주는 일련의 매개 변수도 있습니다. 내가 flannbased KNN 일치를 사용하고, 붙어 거의 비슷한 문제입니다

+0

확인해 주셔서 감사합니다. 나는 근사가 무작위가 아닌 일관된 기술 어로 안정적이라고 이해했다. 이제는 의미가 있습니다. – cdmh