OpenCV - Hough Line Transformation

Sie können die Form eines bestimmten Bildes erkennen, indem Sie die Hough Transform technique mit der Methode HoughLines() des ImgprocKlasse. Es folgt die Syntax dieser Methode.

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

Diese Methode akzeptiert die folgenden Parameter:

  • image - Ein Objekt der Klasse Mat Darstellen des Quellbildes (Eingabebildes).

  • lines - Ein Objekt der Klasse Mat das speichert den Vektor, der die Parameter (r, Φ) der Linien speichert.

  • rho - Eine Variable vom Typ double, die die Auflösung des Parameters r in Pixel darstellt.

  • theta - Eine Variable vom Typ double, die die Auflösung des Parameters Φ im Bogenmaß darstellt.

  • threshold - Eine Variable vom Typ Integer, die die minimale Anzahl von Schnittpunkten darstellt, um eine Linie zu „erkennen“.

Beispiel

Das folgende Programm zeigt, wie Hough-Linien in einem bestimmten Bild erkannt werden.

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

Angenommen, das Folgende ist das Eingabebild hough_input.jpg im obigen Programm angegeben.

Ausgabe

Beim Ausführen des Programms erhalten Sie folgende Ausgabe:

143 
1 
Image Processed

Wenn Sie den angegebenen Pfad öffnen, können Sie das Ausgabebild wie folgt beobachten: