Bạn có thể phát hiện các đường thẳng trong một hình ảnh nhất định bằng cách sử dụng biến đổi đường Hough. Có hai loại biến đổi dòng Hough có sẵn trong OpenCV là, biến đổi dòng Hough tiêu chuẩn và, biến đổi dòng Hough theo xác suất.
Bạn có thể áp dụng Biến đổi đường Hough chuẩn bằng cách sử dụng HoughLines () phương thức của lớp Imgproc. Phương thức này chấp nhận -
-
Hai đối tượng Mat đại diện cho hình ảnh nguồn và vectơ lưu trữ các tham số (r, Φ) của các dòng.
-
Hai biến kép đại diện cho độ phân giải của các tham số r (pixel) và Φ (radian).
-
Một số nguyên đại diện cho số lượng giao cắt tối thiểu để "phát hiện" một đường.
Bạn có thể áp dụng Biến đổi đường Hough theo xác suất bằng cách sử dụng HoughLinesP () phương thức của lớp Imgproc (cùng tham số)
Bạn có thể phát hiện các cạnh trong một hình ảnh nhất định bằng cách sử dụng Canny () phương thức của lớp Imgproc. Phương thức này chấp nhận -
-
Hai đối tượng Mat đại diện cho hình ảnh nguồn và hình ảnh đích.
-
Hai biến kép để giữ các giá trị ngưỡng.
Để phát hiện các cạnh của một hình ảnh nhất định bằng cách sử dụng công cụ phát hiện cạnh mờ -
-
Đọc nội dung của hình ảnh nguồn bằng cách sử dụng imread () phương pháp của Imgcodecs lớp học.
-
Chuyển đổi nó thành một hình ảnh thang độ xám bằng cách sử dụng cvtColor () phương pháp của Imgproc lớp học.
-
Làm mờ hình ảnh thu được (màu xám) bằng cách sử dụng Blur () phương thức của lớp Imgproc với giá trị hạt nhân 3.
-
Áp dụng thuật toán phát hiện cạnh có mép trên hình ảnh bị mờ bằng cách sử dụng canny () phương pháp của Imgproc .
-
Tạo một ma trận trống với tất cả các giá trị bằng 0.
-
Thêm các cạnh được phát hiện vào nó bằng cách sử dụng copyTo () phương pháp của Mat lớp học.
Ví dụ
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 { public void start(Stage stage) throws IOException { //Loading the OpenCV core library System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); String file ="D:\\Images\\road4.jpg"; Mat src = Imgcodecs.imread(file); //Converting the image to Gray Mat gray = new Mat(); Imgproc.cvtColor(src, gray, Imgproc.COLOR_RGBA2GRAY); //Detecting the edges Mat edges = new Mat(); Imgproc.Canny(gray, edges, 60, 60*3, 3, false); // Changing the color of the canny Mat cannyColor = new Mat(); Imgproc.cvtColor(edges, cannyColor, Imgproc.COLOR_GRAY2BGR); //Detecting the hough lines from (canny) 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; //Drawing lines on the image 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); } //Converting matrix to JavaFX writable image Image img = HighGui.toBufferedImage(cannyColor); WritableImage writableImage= SwingFXUtils.toFXImage((BufferedImage) img, null); //Setting the image view ImageView imageView = new ImageView(writableImage); imageView.setX(10); imageView.setY(10); imageView.setFitWidth(575); imageView.setPreserveRatio(true); //Setting the Scene object Group root = new Group(imageView); Scene scene = new Scene(root, 595, 400); stage.setTitle("Hough Line Transform"); stage.setScene(scene); stage.show(); } public static void main(String args[]) { launch(args); } }
Hình ảnh đầu vào
Đầu ra
Khi thực thi, phần trên tạo ra kết quả sau -