Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

OpenCV Java 라이브러리로 두 이미지의 특징점(키포인트) 매칭하기

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

OpenCV Java 라이브러리로 두 이미지의 특징점(키포인트) 매칭하기

이미지 2

OpenCV Java 라이브러리로 두 이미지의 특징점(키포인트) 매칭하기

실행 결과

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

OpenCV Java 라이브러리로 두 이미지의 특징점(키포인트) 매칭하기