आप हफ लाइन ट्रांसफॉर्म का उपयोग करके दी गई इमेज में सीधी रेखाओं का पता लगा सकते हैं। OpenCV में दो प्रकार के हफ लाइन ट्रांसफॉर्म उपलब्ध हैं: स्टैंडर्ड हफ लाइन ट्रांसफॉर्म और प्रोबेबिलिस्टिक हफ लाइन ट्रांसफॉर्म।
आप Imgproc क्लास के HoughLines() मेथड का उपयोग करके स्टैंडर्ड हफ लाइन ट्रांसफॉर्म लागू कर सकते हैं। यह मेथड स्वीकार करता है -
स्रोत इमेज और रेखाओं के पैरामीटर्स (r, Φ) को स्टोर करने वाले वेक्टर का प्रतिनिधित्व करने वाले दो Mat ऑब्जेक्ट्स।
पैरामीटर्स r (पिक्सल्स) और Φ (रेडियंस) के रिज़ॉल्यूशन का प्रतिनिधित्व करने वाले दो डबल वेरिएबल्स।
एक रेखा "डिटेक्ट" करने के लिए न्यूनतम इंटरसेक्शन्स की संख्या का प्रतिनिधित्व करने वाला एक इंटीजर।
आप Imgproc क्लास के HoughLinesP() मेथड का उपयोग करके प्रोबेबिलिस्टिक हफ लाइन ट्रांसफॉर्म लागू कर सकते हैं (समान पैरामीटर्स)।
आप Imgproc क्लास के Canny() मेथड का उपयोग करके दी गई इमेज में एज डिटेक्ट कर सकते हैं। यह मेथड स्वीकार करता है -
स्रोत और गंतव्य इमेजेज का प्रतिनिधित्व करने वाले दो Mat ऑब्जेक्ट्स।
थ्रेशोल्ड मानों को रखने के लिए दो डबल वेरिएबल्स।
दिए गए इमेज के एज Canny एज डिटेक्टर का उपयोग करके डिटेक्ट करने के लिए -
Imgcodecs क्लास के imread() मेथड का उपयोग करके स्रोत इमेज की सामग्री पढ़ें।
Imgproc क्लास के cvtColor() मेथड का उपयोग करके इसे ग्रेस्केल इमेज में कनवर्ट करें।
परिणामी (ग्रे) इमेज को Imgproc क्लास के blur() मेथड का उपयोग करके कर्नेल मान 3 के साथ ब्लर करें।
Imgproc के canny() मेथड का उपयोग करके ब्लर इमेज पर Canny एज डिटेक्शन एल्गोरिदम लागू करें।
सभी मान 0 के साथ एक खाली मैट्रिक्स बनाएं।
Mat क्लास के copyTo() मेथड का उपयोग करके डिटेक्टेड एज को इसमें जोड़ें।
उदाहरण
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 {
// OpenCV कोर लाइब्रेरी लोड करना
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);
// Canny का रंग बदलना
Mat cannyColor = new Mat();
Imgproc.cvtColor(edges, cannyColor, Imgproc.COLOR_GRAY2BGR);
// (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;
// इमेज पर रेखाएं खींचना
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);
}
// मैट्रिक्स को JavaFX राइटेबल इमेज में कनवर्ट करना
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);
// Scene ऑब्जेक्ट सेट करना
Group root = new Group(imageView);
Scene scene = new Scene(root, 595, 400);
stage.setTitle("हफ लाइन ट्रांसफॉर्म");
stage.setScene(scene);
stage.show();
}
public static void main(String args[]) {
launch(args);
}
}
इनपुट इमेज

आउटपुट
उपरोक्त प्रोग्राम निष्पादित करने पर निम्नलिखित आउटपुट उत्पन्न करता है -
