OpenCV - Transformation de la ligne Hough

Vous pouvez détecter la forme d'une image donnée en appliquant le Hough Transform technique en utilisant la méthode HoughLines() du Imgprocclasse. Voici la syntaxe de cette méthode.

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

Cette méthode accepte les paramètres suivants -

  • image - Un objet de la classe Mat représentant l'image source (entrée).

  • lines - Un objet de la classe Mat qui stocke le vecteur qui stocke les paramètres (r, Φ) des lignes.

  • rho - Une variable de type double représentant la résolution du paramètre r en pixels.

  • theta - Une variable de type double représentant la résolution du paramètre Φ en radians.

  • threshold - Une variable de type entier représentant le nombre minimum d'intersections pour «détecter» une ligne.

Exemple

Le programme suivant montre comment détecter les lignes Hough dans une image donnée.

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

Supposons que ce qui suit est l'image d'entrée hough_input.jpg spécifié dans le programme ci-dessus.

Production

Lors de l'exécution du programme, vous obtiendrez la sortie suivante -

143 
1 
Image Processed

Si vous ouvrez le chemin spécifié, vous pouvez observer l'image de sortie comme suit -