我正在开发一个程序来检测矩形形状并绘制边界框到检测区域。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函数名即可。答案也已更新,您可以再次查看答案。祝你好运! –