OpenCV - Преобразование линии Хафа

Вы можете определить форму данного изображения, применив Hough Transform technique используя метод HoughLines() из Imgprocкласс. Ниже приводится синтаксис этого метода.

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

Этот метод принимает следующие параметры -

  • image - Объект класса Mat представляющий исходное (входное) изображение.

  • lines - Объект класса Mat в котором хранится вектор, в котором хранятся параметры (r, Φ) линий.

  • rho - Переменная типа double, представляющая разрешение параметра r в пикселях.

  • theta - Переменная типа double, представляющая разрешение параметра Φ в радианах.

  • threshold - Переменная целочисленного типа, представляющая минимальное количество пересечений для «обнаружения» линии.

пример

Следующая программа демонстрирует, как обнаружить линии Хафа на заданном изображении.

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

Предположим, что следующее - входное изображение hough_input.jpg указанные в вышеуказанной программе.

Вывод

При выполнении программы вы получите следующий вывод -

143 
1 
Image Processed

Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом: