drawMatches() 함수는 두 개의 입력 영상 img1과 img2를 서로 가로로 이어 붙이고, 두 영상 사이의 특징점 매칭 결과를 직선으로 그린 결과 영상 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 영상에서 각각 특징점을 검출하고 기술자를 계산합니다. 각 영상의 기술자는 desc1과 desc2 행렬에 저장됩니다.
• 18행 BFMatcher 클래스 객체를 생성합니다. 기술자 거리 계산 방식은 해밍 거리를 사용합니다.
• 20~21행 desc1과 desc2 기술자를 서로 매칭하여 그 결과를 matches에 저장합니다.
• 23~24행 matches 정보를 이용하여 매칭 결과 영상 dst를 생성합니다.