OpenCV에서 org.opencv.features2d.Feature2D 추상 클래스의 detect() 메서드는 주어진 이미지에서 특징점(keypoints)을 검출합니다. 이 메서드를 호출할 때는 원본 이미지를 나타내는 Mat 객체와, 검출된 특징점을 저장할 빈 MatOfKeyPoint 객체를 인자로 전달해야 합니다.
Features2d 클래스의 drawMatches() 메서드는 두 이미지의 특징점 사이의 매칭 관계를 찾아 이를 시각적으로 그려줍니다. 이 메서드는 다음과 같은 매개변수를 받습니다.
- src1 − 첫 번째 원본 이미지를 나타내는 Mat 객체
- keypoints1 − 첫 번째 이미지의 특징점을 담고 있는 MatOfKeyPoint 객체
- src2 − 두 번째 원본 이미지를 나타내는 Mat 객체
- keypoints2 − 두 번째 이미지의 특징점을 담고 있는 MatOfKeyPoint 객체
- matches1to2 − 첫 번째 이미지에서 두 번째 이미지로의 매칭 정보로, keypoints1[i]에 대응하는 점이 keypoints2[matches[i]]에 존재함을 의미합니다.
- dst − 매칭 결과가 그려질 출력 이미지를 나타내는 Mat 객체
따라서 두 이미지의 특징점을 매칭하려면 다음 순서로 진행합니다.
- imread() 메서드를 사용해 두 개의 원본 이미지를 읽어옵니다.
- detect() 메서드를 사용해 각 이미지의 특징점을 검출합니다.
- drawMatches() 메서드를 사용해 매칭 결과를 찾고 화면에 그립니다.
예제 코드
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfDMatch;
import org.opencv.core.MatOfKeyPoint;
import org.opencv.features2d.FastFeatureDetector;
import org.opencv.features2d.Features2d;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
public class MatchingKeypoints {
public static void main(String args[]) throws Exception {
// OpenCV 핵심 네이티브 라이브러리 로드
System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
// 원본 이미지 읽기
String file1 = "D:\\Images\\feature1.jpg";
Mat src1 = Imgcodecs.imread(file1);
String file2 = "D:\\Images\\feature2.jpg";
Mat src2 = Imgcodecs.imread(file2);
// 출력 이미지를 저장할 빈 행렬 생성
Mat dst = new Mat();
// FAST 특징점 검출기 생성
FastFeatureDetector detector = FastFeatureDetector.create();
// 두 이미지에서 각각 특징점 검출
MatOfKeyPoint keyPoints1 = new MatOfKeyPoint();
detector.detect(src1, keyPoints1);
MatOfKeyPoint keyPoints2 = new MatOfKeyPoint();
detector.detect(src2, keyPoints2);
// 매칭 정보를 저장할 MatOfDMatch 객체 생성
MatOfDMatch matof1to2 = new MatOfDMatch();
// 두 이미지 간 특징점 매칭 후 결과 그리기
Features2d.drawMatches(src1, keyPoints1, src2, keyPoints2, matof1to2, dst);
// 결과 화면에 표시
HighGui.imshow("Feature Matching", dst);
HighGui.waitKey();
}
}입력 이미지
이미지 1 −

이미지 2 −

실행 결과
위 코드를 실행하면 두 이미지에서 검출된 특징점들이 선으로 연결된 매칭 결과 이미지가 창으로 표시됩니다. 연결선이 많을수록 두 이미지가 유사한 특징을 공유한다는 것을 의미합니다.
