Hough 선 변환을 사용하여 주어진 이미지에서 직선을 감지할 수 있습니다. OpenCV에는 두 가지 허프 라인 변환 방법, 즉 표준 허프 라인 변환과 확률적 허프 라인 변환이 있습니다.
Imgproc 클래스의 HoughLines() 메서드를 사용하여 표준 허프 라인 변환을 적용할 수 있습니다. 이 메서드는 다음 매개변수를 허용합니다.
소스 이미지를 나타내는 두 개의 Mat 객체와 선 매개변수(r, Φ)를 저장하는 벡터.
은 매개변수 r(픽셀) 및 Φ(라디안)의 해상도를 나타내는 두 개의 이중 변수를 나타냅니다.
선을 "감지"하는 데 필요한 최소 교차점 수를 나타내는 정수입니다.
Imgproc 클래스의 HoughLinesP() 메서드(동일 매개변수)를 사용하여 Probabilistic Hough Line Transform을 적용할 수 있습니다.
Imgproc 클래스의 Canny() 메서드를 사용하여 특정 이미지에서 가장자리를 감지할 수 있습니다. 이 메서드는 다음 매개변수를 허용합니다.
소스 이미지와 대상 이미지를 나타내는 두 개의 Mat 객체.
임계값을 저장하는 데 사용되는 두 개의 이중 변수입니다.
Canny 가장자리 감지기를 사용하여 특정 이미지의 가장자리를 감지하려면 다음 단계를 따르세요.
Imgcodecs 클래스의 imread() 메서드를 사용하여 소스 이미지의 내용을 읽습니다.
Imgproc 클래스의 cvtColor() 메서드를 사용하여 회색조 이미지로 변환합니다.
Imgproc 클래스의 Blur() 메서드를 사용하여 결과(회색조) 이미지를 커널 값 3으로 흐리게 만듭니다.
Imgproc의 canny() 메소드를 사용하여 흐릿한 이미지에 Canny 가장자리 감지 알고리즘을 적용합니다.
모든 값이 0인 빈 행렬을 만듭니다.
Mat 클래스의 copyTo() 메서드를 사용하여 감지된 가장자리를 추가하세요.
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.CvType; 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 HoughLineTransform extends Application { public void start(Stage stage) throws IOException { //Loading the OpenCV core library System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); String file ="D:\Images\road4.jpg"; Mat src = Imgcodecs.imread(file); //Converting the image to Gray Mat gray = new Mat(); Imgproc.cvtColor(src, gray, Imgproc.COLOR_RGBA2GRAY); //Detecting the edges Mat edges = new Mat(); Imgproc.Canny(gray, edges, 60, 60*3, 3, false); // Changing the color of the canny Mat cannyColor = new Mat(); Imgproc.cvtColor(edges, cannyColor, Imgproc.COLOR_GRAY2BGR); //Detecting the hough lines from (canny) Mat lines = new Mat(); Imgproc.HoughLines(edges, lines, 1, Math.PI/180, 150); for (int i = 0; i < lines.rows(); i++) { double[] data = lines.get(i, 0); double rho = data[0]; double theta = data[1]; double a = Math.cos(theta); double b = Math.sin(theta); double x0 = a*rho; double y0 = b*rho; //Drawing lines on the image Point pt1 = new Point(); Point pt2 = new Point(); pt1.x = Math.round(x0 + 1000*(-b)); pt1.y = Math.round(y0 + 1000*(a)); pt2.x = Math.round(x0 - 1000*(-b)); pt2.y = Math.round(y0 - 1000 *(a)); Imgproc.line(cannyColor, pt1, pt2, new Scalar(0, 0, 255), 3); } //Converting matrix to JavaFX writable image Image img = HighGui.toBufferedImage(cannyColor); WritableImage writableImage= SwingFXUtils.toFXImage((BufferedImage) img, null); //Setting the image view ImageView imageView = new ImageView(writableImage); imageView.setX(10); imageView.setY(10); imageView.setFitWidth(575); imageView.setPreserveRatio(true); //Setting the Scene object 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); } }
실행 후 위 코드는 다음과 같은 출력을 생성합니다. −
위 내용은 Java를 사용하여 OpenCV 허프 라인 변환 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!