Computer >> Máy Tính >  >> Lập trình >> Java

Triển khai OpenCV Hough Line Transform sử dụng Java.

Bạn có thể phát hiện các đường thẳng trong một hình ảnh nhất định bằng cách sử dụng biến đổi đường Hough. Có hai loại biến đổi dòng Hough có sẵn trong OpenCV là, biến đổi dòng Hough tiêu chuẩn và, biến đổi dòng Hough theo xác suất.

Bạn có thể áp dụng Biến đổi đường Hough chuẩn bằng cách sử dụng HoughLines () phương thức của lớp Imgproc. Phương thức này chấp nhận -

  • Hai đối tượng Mat đại diện cho hình ảnh nguồn và vectơ lưu trữ các tham số (r, Φ) của các dòng.

  • Hai biến kép đại diện cho độ phân giải của các tham số r (pixel) và Φ (radian).

  • Một số nguyên đại diện cho số lượng giao cắt tối thiểu để "phát hiện" một đường.

Bạn có thể áp dụng Biến đổi đường Hough theo xác suất bằng cách sử dụng HoughLinesP () phương thức của lớp Imgproc (cùng tham số)

Bạn có thể phát hiện các cạnh trong một hình ảnh nhất định bằng cách sử dụng Canny () phương thức của lớp Imgproc. Phương thức này chấp nhận -

  • Hai đối tượng Mat đại diện cho hình ảnh nguồn và hình ảnh đích.

  • Hai biến kép để giữ các giá trị ngưỡng.

Để phát hiện các cạnh của một hình ảnh nhất định bằng cách sử dụng công cụ phát hiện cạnh mờ -

  • Đọc nội dung của hình ảnh nguồn bằng cách sử dụng imread () phương pháp của Imgcodecs lớp học.

  • Chuyển đổi nó thành một hình ảnh thang độ xám bằng cách sử dụng cvtColor () phương pháp của Imgproc lớp học.

  • Làm mờ hình ảnh thu được (màu xám) bằng cách sử dụng Blur () phương thức của lớp Imgproc với giá trị hạt nhân 3.

  • Áp dụng thuật toán phát hiện cạnh có mép trên hình ảnh bị mờ bằng cách sử dụng canny () phương pháp của Imgproc .

  • Tạo một ma trận trống với tất cả các giá trị bằng 0.

  • Thêm các cạnh được phát hiện vào nó bằng cách sử dụng copyTo () phương pháp của Mat lớp học.

Ví dụ

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);
   }
}

Hình ảnh đầu vào

Triển khai OpenCV Hough Line Transform sử dụng Java.

Đầu ra

Khi thực thi, phần trên tạo ra kết quả sau -

Triển khai OpenCV Hough Line Transform sử dụng Java.