더북(TheBook)

drawMatches() 함수는 두 개의 입력 영상 img1img2를 서로 가로로 이어 붙이고, 두 영상 사이의 특징점 매칭 결과를 직선으로 그린 결과 영상 outimg를 반환합니다. 두 입력 영상 사이의 매칭 정보는 matches1to2 인자로 전달합니다. 매칭 결과를 그리는 방식은 flags 인자로 지정할 수 있으며, flags 인자에는 14.2.2절에서 설명한 DrawMatchesFlags 열거형 상수를 지정할 수 있습니다.

ORB 알고리즘을 이용하여 두 장의 영상에서 특징점을 검출하고 서로 매칭하는 예제 코드를 코드 14-6에 나타냈습니다. 코드 14-6의 keypoint_matching() 함수는 box.png 스낵 상자 영상과 스낵 상자를 포함하고 있는 box_in_scene.png 장면 영상에서 ORB 알고리즘으로 특징점을 검출하고, BFMatcher 클래스를 이용하여 서로 유사한 특징점을 찾아 매칭합니다. keypoint_matching() 함수가 정의된 소스 파일과 사용된 영상 파일은 내려받은 예제 파일 중 ch14/matching 프로젝트에서 확인할 수 있습니다.

코드 14-6 키포인트 매칭 예제 [ch14/matching]

01    void keypoint_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        Mat dst;
24        drawMatches(src1, keypoints1, src2, keypoints2, matches, dst);
25     
26        imshow("dst", dst);
27     
28        waitKey();
29        destroyAllWindows();
30    }

 

3~4행 두 장의 영상을 각각 src1과 src2에 저장합니다.

11행 ORB 클래스 객체를 생성합니다.

13~16행 src1과 src2 영상에서 각각 특징점을 검출하고 기술자를 계산합니다. 각 영상의 기술자는 desc1desc2 행렬에 저장됩니다.

18행 BFMatcher 클래스 객체를 생성합니다. 기술자 거리 계산 방식은 해밍 거리를 사용합니다.

20~21행 desc1desc2 기술자를 서로 매칭하여 그 결과를 matches에 저장합니다.

23~24행 matches 정보를 이용하여 매칭 결과 영상 dst를 생성합니다.

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