Java 如何在OpenCV Android中合并HoughLinesP产生的相邻行?
我正在制作一个Android应用程序,用于检测数独难题并找到答案。在第一部分中,我需要从给定的图像中提取数独。我成功地使用HoughLinesP找到了(数独)的包含框,但由于图像中存在粗线条,因此生成了大量线条。我需要将属于同一条“粗线”的houghline合并为一条线,但我无法这样做。到目前为止,我的代码是:Java 如何在OpenCV Android中合并HoughLinesP产生的相邻行?,java,android,opencv,hough-transform,houghlinesp,Java,Android,Opencv,Hough Transform,Houghlinesp,我正在制作一个Android应用程序,用于检测数独难题并找到答案。在第一部分中,我需要从给定的图像中提取数独。我成功地使用HoughLinesP找到了(数独)的包含框,但由于图像中存在粗线条,因此生成了大量线条。我需要将属于同一条“粗线”的houghline合并为一条线,但我无法这样做。到目前为止,我的代码是: Mat inputMat = new Mat(inputBitmap.getHeight(), inputBitmap.getWidth(), CvType.CV_8UC1);
Mat inputMat = new Mat(inputBitmap.getHeight(), inputBitmap.getWidth(), CvType.CV_8UC1);
Utils.bitmapToMat(inputBitmap, inputMat, false);
Mat grayMat = new Mat();
Imgproc.cvtColor(inputMat, grayMat, Imgproc.COLOR_BGR2GRAY);
Mat blurMat = new Mat();
Imgproc.blur(grayMat, blurMat, new Size(1, 1));
Mat cannyEdges = new Mat();
Imgproc.Canny(blurMat, cannyEdges, 50, 200);
Mat lines = new Mat();
Imgproc.HoughLinesP(cannyEdges, lines, 1, Math.PI / 180, 150);
List<double[]> horizontalLines = new ArrayList<>();
List<double[]> verticalLines = new ArrayList<>();
for(int i = 0 ; i < lines.cols() ; i++) {
double[] line = lines.get(0, i);
double x1 = line[0];
double y1 = line[1];
double x2 = line[2];
double y2 = line[3];
if (Math.abs(y2 - y1) < Math.abs(x2 - x1)) {
horizontalLines.add(line);
} else if (Math.abs(x2 - x1) < Math.abs(y2 - y1)) {
verticalLines.add(line);
}
}
Mat inputMat=new Mat(inputbimat.getHeight(),inputbimat.getWidth(),CvType.CV_8UC1);
位图编辑器(inputBitmap、inputMat、false);
Mat grayMat=新Mat();
Imgproc.cvt颜色(输入框、灰度框、Imgproc.COLOR\u bgr2灰色);
Mat blurMat=新的Mat();
Imgproc.blur(灰度、模糊、新尺寸(1,1));
Mat cannyEdges=新Mat();
Imgproc.Canny(blurMat,cannyEdges,50200);
垫线=新垫();
Imgproc.HoughLinesP(cannyEdges,lines,1,Math.PI/180150);
List horizontalLines=new ArrayList();
List verticalline=new ArrayList();
对于(int i=0;i
所以,技术上我需要10条水平线和10条垂直线。
PS:只有数独在视图中,即图像中没有其他线条,只有普通的数独。请帮我解决这个问题,非常感谢您的时间:)可能的重复,因此您已经分割了垂直线和水平线;现在,当在同一位置有多条垂直或水平线时,只需画一条线。如果一条线的
x
值靠得很近,那么这条线是垂直的,而且,如果多条线的x
值靠得很近(在某个阈值内,比如20个像素),那么它们代表同一条线。但是,更好的方法可能是计算所有直线的交点,并使用这些点绘制直线。参见我的答案,例如,可能重复的,因此您已经分割了垂直线和水平线;现在,当在同一位置有多条垂直或水平线时,只需画一条线。如果一条线的x
值靠得很近,那么这条线是垂直的,而且,如果多条线的x
值靠得很近(在某个阈值内,比如20个像素),那么它们代表同一条线。但是,更好的方法可能是计算所有直线的交点,并使用这些点绘制直线。请看我的答案。