Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在OpenCV Android中合并HoughLinesP产生的相邻行?_Java_Android_Opencv_Hough Transform_Houghlinesp - Fatal编程技术网

Java 如何在OpenCV Android中合并HoughLinesP产生的相邻行?

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);

我正在制作一个Android应用程序,用于检测数独难题并找到答案。在第一部分中,我需要从给定的图像中提取数独。我成功地使用HoughLinesP找到了(数独)的包含框,但由于图像中存在粗线条,因此生成了大量线条。我需要将属于同一条“粗线”的houghline合并为一条线,但我无法这样做。到目前为止,我的代码是:

    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个像素),那么它们代表同一条线。但是,更好的方法可能是计算所有直线的交点,并使用这些点绘制直线。请看我的答案。