이 코드가 실행되면 good_matches 변수에는 전체 매칭 결과 matches 중에서 매칭이 잘 된 50개의 매칭 결과만 저장됩니다.
키포인트 매칭 후 좋은 매칭 결과만 추출하고, 그 결과를 화면에 출력하는 예제 코드를 코드 14-7에 나타냈습니다. 코드 14-7의 good_matching() 함수는 코드 14-6의 keypoint_matching() 함수 정의에 좋은 매칭 선별 코드가 추가된 형태입니다. good_matching() 함수가 정의된 소스 파일과 사용된 영상 파일은 내려받은 예제 파일 중 ch14/matching 프로젝트에서 확인할 수 있습니다.
코드 14-7 키포인트 매칭 후 좋은 매칭 선별 예제 [ch14/matching]
01 void good_matching() 02 { 03 Mat src1 = imread("box.png", IMREAD_GRAYSCALE); 04 Mat src2 = imread("box_in_scene.png", IMREAD_GRAYSCALE); 05 06 if (src1.empty() || src2.empty()) { 07 cerr << "Image load failed!" << endl; 08 return; 09 } 10 11 Ptr<Feature2D> feature = ORB::create(); 12 13 vector<KeyPoint> keypoints1, keypoints2; 14 Mat desc1, desc2; 15 feature->detectAndCompute(src1, Mat(), keypoints1, desc1); 16 feature->detectAndCompute(src2, Mat(), keypoints2, desc2); 17 18 Ptr<DescriptorMatcher> matcher = BFMatcher::create(NORM_HAMMING); 19 20 vector<DMatch> matches; 21 matcher->match(desc1, desc2, matches); 22 23 std::sort(matches.begin(), matches.end()); 24 vector<DMatch> good_matches(matches.begin(), matches.begin() + 50); 25 26 Mat dst; 27 drawMatches(src1, keypoints1, src2, keypoints2, good_matches, dst, 28 Scalar::all(-1), Scalar::all(-1), vector<char>(), 29 DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS); 30 31 imshow("dst", dst); 32 33 waitKey(); 34 destroyAllWindows(); 35 }
• 3~21행 코드 14-6의 keypoint_matching() 함수와 같습니다.
• 23행 두 영상의 특징점 매칭 결과를 정렬합니다.
• 24행 정렬된 매칭 결과에서 상위 50개 매칭 결과를 good_matches에 저장합니다.
• 26~29행 good_matches를 이용하여 매칭 결과 영상을 생성합니다. drawMatches() 함수의 10번째 인자에 DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS 상수를 지정하여 매칭되지 않은 특징점은 화면에 표시하지 않습니다.