OpenCV - Trasformazione linea di Hough

È possibile rilevare la forma di una determinata immagine applicando il Hough Transform technique utilizzando il metodo HoughLines() del Imgprocclasse. Di seguito è riportata la sintassi di questo metodo.

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

Questo metodo accetta i seguenti parametri:

  • image - Un oggetto della classe Mat che rappresenta l'immagine sorgente (ingresso).

  • lines - Un oggetto della classe Mat che memorizza il vettore che memorizza i parametri (r, Φ) delle linee.

  • rho - Una variabile di tipo double che rappresenta la risoluzione del parametro r in pixel.

  • theta - Una variabile di tipo double che rappresenta la risoluzione del parametro Φ in radianti.

  • threshold - Una variabile di tipo intero che rappresenta il numero minimo di intersezioni per "rilevare" una linea.

Esempio

Il seguente programma mostra come rilevare le linee di Hough in una data immagine.

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

Supponiamo che la seguente sia l'immagine in ingresso hough_input.jpg specificato nel programma di cui sopra.

Produzione

All'esecuzione del programma, otterrai il seguente output:

143 
1 
Image Processed

Se apri il percorso specificato, puoi osservare l'immagine di output come segue: