더북(TheBook)

이 코드가 실행되면 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 상수를 지정하여 매칭되지 않은 특징점은 화면에 표시하지 않습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.