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

Java에서 OpenCV 확률적 허프 라인 변환(HoughLinesP) 구현하기


허프 라인 변환(Hough Line Transform)은 이미지 속 직선을 검출하는 대표적인 기법입니다. OpenCV에서는 두 가지 종류의 허프 라인 변환을 제공하는데, 바로 표준 허프 라인 변환(Standard Hough Line Transform)확률적 허프 라인 변환(Probabilistic Hough Line Transform)입니다.

확률적 허프 라인 변환이란?

확률적 허프 라인 변환은 표준 허프 변환의 최적화 버전으로, 전체 픽셀이 아닌 무작위로 선택된 일부 픽셀만 사용해 연산량을 크게 줄이면서도 선분의 시작점과 끝점 좌표를 직접 반환한다는 장점이 있습니다.

OpenCV에서는 Imgproc 클래스의 HoughLinesP() 메서드를 호출하여 확률적 허프 라인 변환을 적용할 수 있습니다. 이 메서드는 다음과 같은 매개변수를 받습니다.

  • 원본 이미지와 검출된 선분의 파라미터(x1, y1, x2, y2)를 저장할 벡터를 나타내는 두 개의 Mat 객체
  • r(픽셀 단위)과 Φ(라디안 단위) 파라미터의 해상도를 나타내는 두 개의 double 변수
  • 하나의 선으로 "검출"하기 위해 필요한 최소 교차 횟수를 나타내는 정수 값

예제 코드

다음 Java 예제는 OpenCV의 확률적 허프 라인 변환을 사용하여 이미지 속 직선을 검출합니다.

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class HoughLineProbabilisticTransform extends Application {
    public void start(Stage stage) throws IOException {
        // OpenCV 핵심 네이티브 라이브러리 로드
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        String file = "D:\\Images\\road4.jpg";
        Mat src = Imgcodecs.imread(file);

        // 이미지를 그레이스케일로 변환
        Mat gray = new Mat();
        Imgproc.cvtColor(src, gray, Imgproc.COLOR_RGBA2GRAY);

        // Canny 알고리즘으로 에지 검출
        Mat edges = new Mat();
        Imgproc.Canny(gray, edges, 60, 60 * 3, 3, false);

        // Canny 결과 이미지의 색상 변경
        Mat cannyColor = new Mat();
        Imgproc.cvtColor(edges, cannyColor, Imgproc.COLOR_GRAY2BGR);

        // Canny 결과에서 허프 라인 검출
        Mat lines = new Mat();
        Imgproc.HoughLinesP(edges, lines, 1, Math.PI / 180, 50, 50, 10);

        for (int i = 0; i < lines.rows(); i++) {
            double[] data = lines.get(i, 0);
            // 이미지 위에 검출된 선 그리기
            Point pt1 = new Point(data[0], data[1]);
            Point pt2 = new Point(data[2], data[3]);
            Imgproc.line(cannyColor, pt1, pt2, new Scalar(0, 0, 255), 3);
        }

        // Mat 행렬을 JavaFX WritableImage로 변환
        Image img = HighGui.toBufferedImage(cannyColor);
        WritableImage writableImage = SwingFXUtils.toFXImage((BufferedImage) img, null);

        // ImageView 설정
        ImageView imageView = new ImageView(writableImage);
        imageView.setX(10);
        imageView.setY(10);
        imageView.setFitWidth(575);
        imageView.setPreserveRatio(true);

        // Scene 객체 설정 및 화면 출력
        Group root = new Group(imageView);
        Scene scene = new Scene(root, 595, 400);
        stage.setTitle("Hough Line Transform");
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String args[]) {
        launch(args);
    }
}

코드 처리 흐름 요약

  1. 라이브러리 로드: System.loadLibrary()로 OpenCV 네이티브 라이브러리를 불러옵니다.
  2. 그레이스케일 변환: cvtColor() 메서드로 컬러 이미지를 흑백 이미지로 변환합니다.
  3. 에지 검출: Canny() 메서드로 이미지의 윤곽선(에지)을 추출합니다.
  4. 허프 변환 적용: HoughLinesP() 메서드로 에지 이미지에서 직선을 검출합니다.
  5. 결과 시각화: 검출된 선분을 빨간색(Scalar(0, 0, 255))으로 원본 위에 그려 화면에 표시합니다.

입력 이미지

Java에서 OpenCV 확률적 허프 라인 변환(HoughLinesP) 구현하기

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다. 도로 이미지에서 차선에 해당하는 직선들이 빨간색 선분으로 표시되는 것을 확인할 수 있습니다.

Java에서 OpenCV 확률적 허프 라인 변환(HoughLinesP) 구현하기