我正在開發一個程序來檢測矩形形狀並繪製邊界框到檢測區域。Java OpenCV - 使用霍夫變換的矩形檢測
對於邊緣檢測,我使用了Canny邊緣檢測。然後,我使用霍夫變換來提取線條。
這是原始圖像 enter image description here
這是結果圖像 enter image description here
我的問題是我不能畫一個邊界框所檢測到的區域。 看來我的程序只能檢測到一條水平線。 如何檢測矩形形狀並將矩形線繪製爲檢測到的形狀?
我讀過類似的問題,它需要找到矩形的4個角點,檢查點是否是90度,並找到交點。我真的很困惑如何在Java opencv中編寫它。其他方法來檢測形狀和繪製邊界框到檢測到也可以。
下面的代碼
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.core.Size;
import org.opencv.imgcodecs.*;
import org.opencv.imgproc.Imgproc;
public class HoughTransformCV2 {
public static void main(String[] args) {
try {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat source = Imgcodecs.imread("rectangle.jpg", Imgcodecs.CV_LOAD_IMAGE_ANYCOLOR);
Mat destination = new Mat(source.rows(), source.cols(), source.type());
Imgproc.cvtColor(source, destination, Imgproc.COLOR_RGB2GRAY);
Imgproc.equalizeHist(destination, destination);
Imgproc.GaussianBlur(destination, destination, new Size(5, 5), 0, 0, Core.BORDER_DEFAULT);
Imgproc.Canny(destination, destination, 50, 100);
//Imgproc.adaptiveThreshold(destination, destination, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 15, 40);
Imgproc.threshold(destination, destination, 0, 255, Imgproc.THRESH_BINARY);
if (destination != null) {
Mat lines = new Mat();
Imgproc.HoughLinesP(destination, lines, 1, Math.PI/180, 50, 30, 10);
Mat houghLines = new Mat();
houghLines.create(destination.rows(), destination.cols(), CvType.CV_8UC1);
//Drawing lines on the image
for (int i = 0; i < lines.cols(); i++) {
double[] points = lines.get(0, i);
double x1, y1, x2, y2;
x1 = points[0];
y1 = points[1];
x2 = points[2];
y2 = points[3];
Point pt1 = new Point(x1, y1);
Point pt2 = new Point(x2, y2);
//Drawing lines on an image
Imgproc.line(source, pt1, pt2, new Scalar(0, 0, 255), 4);
}
}
Imgcodecs.imwrite("rectangle_houghtransform.jpg", source);
} catch (Exception e) {
System.out.println("error: " + e.getMessage());
}
}
}
在Java的任何幫助,將不勝感激:) 非常感謝你!
@Bahrandum Adil你會澄清if方法中的「角度」,「drawText」和「三角形」方法嗎?我是新的opencv,我不知道這些是庫中的靜態方法還是你自己實現的函數。你對Imgproc.Canny使用什麼「門檻」? –
@JonathanBarbero嗨!大部分OpenCV函數都是靜態的。像Imgproc或Core的函數一樣,您可以直接使用這些函數,只需使用Class name函數名即可。答案也已更新,您可以再次查看答案。祝你好運! –