Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Biến đổi Hough Line chuẩn (Standard) trong OpenCV Java

Phát hiện đường thẳng dùng Hough Line Transform. Có 2 loại: Standard (HoughLines) và Probabilistic (HoughLinesP).

Phương thức HoughLines() của Imgproc áp dụng Standard Hough Line Transform. Tham số:

  • Hai Mat: ảnh nguồn và vector lưu tham số (r, Φ).
  • Hai double: độ phân giải r (pixel) và Φ (radian).
  • Int: số giao điểm tối thiểu để phát hiện đường.

Để phát hiện cạnh dùng Canny() của Imgproc: nhận hai Mat (nguồn, đích) và hai double (ngưỡng).

Quy trình phát hiện cạnh Canny:

  1. Đọc ảnh nguồn bằng imread() của Imgcodecs.
  2. Chuyển xám bằng cvtColor() của Imgproc.
  3. Làm mờ ảnh xám bằng blur() kernel 3.
  4. Áp dụng Canny bằng canny() của Imgproc.
  5. Tạo ma trận 0, copy cạnh vào bằng copyTo() của Mat.

Ví dụ minh họa

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class HoughLineTransform extends Application {
    @Override
    public void start(Stage stage) throws IOException {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        String file = "D:\\Images\\road4.jpg";
        Mat src = Imgcodecs.imread(file);
        
        Mat gray = new Mat();
        Imgproc.cvtColor(src, gray, Imgproc.COLOR_RGBA2GRAY);
        
        Mat edges = new Mat();
        Imgproc.Canny(gray, edges, 60, 60*3, 3, false);
        
        Mat cannyColor = new Mat();
        Imgproc.cvtColor(edges, cannyColor, Imgproc.COLOR_GRAY2BGR);
        
        // Standard Hough Lines
        Mat lines = new Mat();
        Imgproc.HoughLines(edges, lines, 1, Math.PI/180, 150);
        
        for (int i = 0; i < lines.rows(); i++) {
            double[] data = lines.get(i, 0);
            double rho = data[0];
            double theta = data[1];
            double a = Math.cos(theta);
            double b = Math.sin(theta);
            double x0 = a * rho;
            double y0 = b * rho;
            
            Point pt1 = new Point();
            Point pt2 = new Point();
            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), 3);
        }
        
        Image img = HighGui.toBufferedImage(cannyColor);
        WritableImage writableImage = SwingFXUtils.toFXImage((BufferedImage) img, null);
        
        ImageView imageView = new ImageView(writableImage);
        imageView.setX(10);
        imageView.setY(10);
        imageView.setFitWidth(575);
        imageView.setPreserveRatio(true);
        
        Group root = new Group(imageView);
        Scene scene = new Scene(root, 595, 400);
        stage.setTitle("Hough Line Transform (Standard)");
        stage.setScene(scene);
        stage.show();
    }
    
    public static void main(String[] args) {
        launch(args);
    }
}

Hình ảnh đầu vào và kết quả

Input: Biến đổi Hough Line chuẩn (Standard) trong OpenCV Java

Output: Biến đổi Hough Line chuẩn (Standard) trong OpenCV Java