OpenCV - Transformasi Garis Hough

Anda dapat mendeteksi bentuk gambar tertentu dengan menerapkan Hough Transform technique menggunakan metode ini HoughLines() dari Imgprockelas. Berikut adalah sintaks dari metode ini.

HoughLines(image, lines, rho, theta, threshold)

Metode ini menerima parameter berikut -

  • image - Objek kelas Mat mewakili gambar sumber (masukan).

  • lines - Objek kelas Mat yang menyimpan vektor yang menyimpan parameter (r, Φ) dari garis.

  • rho - Variabel tipe double yang mewakili resolusi parameter r dalam piksel.

  • theta - Variabel bertipe double yang merepresentasikan resolusi parameter rad dalam radian.

  • threshold - Variabel jenis bilangan bulat yang mewakili jumlah minimum persimpangan untuk "mendeteksi" garis.

Contoh

Program berikut menunjukkan cara mendeteksi garis Hough pada gambar tertentu.

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;

import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class HoughlinesTest {
   public static void main(String args[]) throws Exception {
      // Loading the OpenCV core library
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );

      // Reading the Image from the file and storing it in to a Matrix object
      String file = "E:/OpenCV/chap21/hough_input.jpg";

      // Reading the image
      Mat src = Imgcodecs.imread(file,0);

      // Detecting edges of it
      Mat canny = new Mat();
      Imgproc.Canny(src, canny, 50, 200, 3, false);

      // Changing the color of the canny
      Mat cannyColor = new Mat();
      Imgproc.cvtColor(canny, cannyColor, Imgproc.COLOR_GRAY2BGR);

      // Detecting the hough lines from (canny)
      Mat lines = new Mat();
      Imgproc.HoughLines(canny, lines, 1, Math.PI/180, 100);

      System.out.println(lines.rows());
      System.out.println(lines.cols());

      // Drawing lines on the image
      double[] data;
      double rho, theta;
      Point pt1 = new Point();
      Point pt2 = new Point();
      double a, b;
      double x0, y0;
      
      for (int i = 0; i < lines.cols(); i++) {
         data = lines.get(0, i);
         rho = data[0];
         theta = data[1];
         
         a = Math.cos(theta);
         b = Math.sin(theta);
         x0 = a*rho;
         y0 = b*rho;
         
         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), 6);
      }
      // Writing the image
      Imgcodecs.imwrite("E:/OpenCV/chap21/hough_output.jpg", cannyColor);
          
      System.out.println("Image Processed");
   }
}

Asumsikan bahwa berikut ini adalah gambar input hough_input.jpg ditentukan dalam program di atas.

Keluaran

Saat menjalankan program, Anda akan mendapatkan output berikut -

143 
1 
Image Processed

Jika Anda membuka jalur yang ditentukan, Anda dapat mengamati gambar keluaran sebagai berikut -