2013-05-10 4 views
3

얼굴 인식 응용 프로그램을 위해 VS2010에서 OpenCV C++를 사용하고 있습니다. 그것을 위해, 나는 SURF, BruteForceMatcher를 사용했습니다.C++을 사용하여 SURF OpenCV를 사용하여 가장 일치하는 항목을 찾는 방법은 무엇입니까?

BFMatcher matcher; 
    vector<DMatch> matches; 

//match: execute the matcher! 
    matcher.match(descriptors1,descriptors2, matches); 

이 메서드를 호출하면 정확히 무슨 일이 발생하는지 알고 싶습니다. 제스처가 "일치"이면 일치하는 키 포인트로 벡터가 채워집니다.

그리고

어쨌든 나는 좋은 상대를 만나이 "일치"벡터가 사용할 수 있습니까?
현재, 나는 최소 거리 및 최대 거리를 얻기 위해이 같은 일을 해요 :

for(int i = 0; i < descriptors1.rows; i++) 
    { 
     double dist = matches[i].distance; 
     if(dist < min_dist) min_dist = dist; 
     if(dist > max_dist) max_dist = dist; 
    } 

내 위의 방법이 정확하다면, 어떻게 이미지를 일치 여부를 확인하기 위해 최소 거리 및 최대 거리를 사용할 수 있습니다 .

감사합니다.

누구든지 나를 찾아 낼 수 있다면 감사 할 것입니다. 감사합니다. .

답변

4

knnMatch() 방법으로 이미지를 비교하여 가장 가까운 두 개의 이웃을 계산할 수 있습니다. 첫 번째 이미지의 각 설명자에 대해 두 번째 이미지에서 가장 근접한 일치 수가 2 개 있습니다.

이 일치는 설명 자 간의 거리를 기준으로 한 두 가지 최상의 일치입니다. 일치하는 거리가 비슷한 경우 잘못된 것을 선택할 수도 있습니다. 이 경우 해당 경기를 폐기해야합니다. 거리 비율을 확인하면됩니다. 첫 번째 일치와 두 번째 일치 사이의 거리 비율이 선택한 임계 값보다 크지 않은 경우 일치 항목을 버려야합니다. 나중에 더 나은 결과를 얻기 위해 예를 들어 RANSAC 테스트를 수행 할 수 있습니다.

+0

감사합니다. J-X320, 빠른 응답을위한 mada. knnMatch() 메서드를 사용해 보았습니다. 그리고 그것은 나에게 좋은 결과를 줬다. 감사. – posha