box_in_scene.png 영상에서는 box.png 스낵 상자 영상 일부가 가려져 있기 때문에 box.png 영상에서 추출한 특징점이 모두 제대로 매칭되기는 어렵습니다. 일부 영역이 가려져 있지 않더라도 기하학적 변형과 조명 변화로 인하여 완벽한 매칭은 거의 불가능하며, 매칭 결과 중 상당수는 완전히 다른 특징점으로 잘못 매칭됩니다. 그러므로 전체 매칭 결과에서 잘못 매칭된 결과는 제외하고, 제대로 매칭되었다고 판단되는 결과만 선별하여 사용해야 합니다.
DMatch 클래스는 기술자 사이의 거리를 표현하는 distance를 멤버 변수로 가지고 있습니다. 그러므로 distance 값이 너무 큰 매칭 결과는 무시하고 distance 값이 작은 결과만 사용하는 것이 좋습니다. DMatch 클래스는 부등호 연산자에 대한 재정의가 되어 있고, 이 연산자 재정의에서는 distance 멤버 변수 크기를 비교하기 때문에 DMatch 객체를 std::sort() 함수로 정렬하면 자동으로 distance 값을 기준으로 정렬됩니다.
예를 들어 앞서 코드 14-6의 keypoint_matching() 함수에서 두 영상에서 추출한 기술자 desc1과 desc2를 매칭한 후, 매칭 결과를 distance 값 기준으로 오름차순 정렬하려면 다음과 같이 코드를 작성합니다.
vector<DMatch> matches; matcher->match(desc1, desc2, matches); std::sort(matches.begin(), matches.end());
앞 코드가 실행되면 matches에 저장된 DMatch 객체들은 distance 값이 작은 순서대로 앞쪽에 위치하게 됩니다. 그러므로 정렬된 matches에서 좋은 매칭 결과만 추출하려면 다음과 같이 코드를 작성할 수 있습니다.
vector<DMatch> good_matches(matches.begin(), matches.begin() + 50);