개요
컴퓨터 비전에서 특징점(keypoint) 검출은 이미지 내에서 객체 인식, 매칭, 추적 등에 활용되는 핵심 기술입니다. org.opencv.features2d 패키지의 추상 클래스 Feature2D가 제공하는 detect() 메서드를 사용하면 주어진 이미지에서 특징점을 손쉽게 검출할 수 있습니다.
이 메서드를 호출할 때는 원본 이미지를 나타내는 Mat 객체와, 검출된 특징점을 저장할 빈 MatOfKeyPoint 객체를 인수로 전달해야 합니다.
또한 검출된 특징점을 이미지 위에 시각적으로 표시하려면 org.opencv.features2d.Features2d 클래스의 drawKeypoints() 메서드를 사용하면 됩니다.
참고 사항
Feature2D는 추상 클래스이므로 detect() 메서드를 직접 호출할 수 없으며, 반드시 하위 클래스 중 하나를 인스턴스화해서 사용해야 합니다. 여기서는 속도가 빠르기로 잘 알려진 FastFeatureDetector 클래스를 사용했습니다.
Features2D와 Features2d는 features2d 패키지에서 서로 다른 의미로 쓰일 수 있으므로 대소문자 혼동에 주의하세요.
예제 코드
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfKeyPoint;
import org.opencv.core.Scalar;
import org.opencv.features2d.FastFeatureDetector;
import org.opencv.features2d.Features2d;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
public class DetectingKeyPoints {
public static void main(String args[]) throws Exception {
// OpenCV 핵심 네이티브 라이브러리 로드
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
// 이미지 파일 읽기
String file = "D:\\Images\\javafx_graphical.jpg";
Mat src = Imgcodecs.imread(file);
// 이미지의 특징점 검출
Mat dst = new Mat();
MatOfKeyPoint matOfKeyPoints = new MatOfKeyPoint();
FastFeatureDetector featureDetector = FastFeatureDetector.create();
featureDetector.detect(src, matOfKeyPoints);
// 검출된 특징점 그리기
Features2d.drawKeypoints(src, matOfKeyPoints, dst, new Scalar(0, 0, 255));
// 결과 화면에 출력
HighGui.imshow("Feature Detection", dst);
HighGui.waitKey();
}
}코드 설명
System.loadLibrary(): OpenCV 네이티브 라이브러리를 로드하여 Java 바인딩이 네이티브 코드를 사용할 수 있도록 합니다.
Imgcodecs.imread(): 지정된 경로의 이미지 파일을 읽어 Mat 객체로 반환합니다.
FastFeatureDetector.create(): FAST(Features from Accelerated Segment Test) 알고리즘 기반의 특징점 검출기 객체를 생성합니다.
drawKeypoints(): 검출된 특징점을 원본 이미지 위에 빨간색(0, 0, 255)으로 표시합니다.
입력 이미지

출력 결과
