Как объединить соседние строки, полученные в результате HoughLinesP в OpenCV Android?

Я делаю приложение для Android для обнаружения головоломки судоку и поиска ответа на нее. В первой части мне нужно извлечь судоку из данного изображения. Я успешно смог использовать HoughLinesP, чтобы найти содержащее поле (судоку), но из-за толстых линий, присутствующих на изображении, генерируется очень большое количество строк. Мне нужно объединить houghLines, принадлежащие одной и той же «толстой линии», в одну строку, но я не могу этого сделать. Мой код до сих пор:

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

Итак, технически мне нужно 10 горизонтальных и 10 вертикальных линий. PS: Видна только судоку, т.е. на изображении нет других строк, только простая судоку. Пожалуйста, помогите мне решить эту проблему и большое спасибо за ваше время :)


person tarohtTimus    schedule 25.08.2017    source источник
comment
Итак, вы уже разделили вертикальные и горизонтальные линии; теперь все, что вам нужно сделать, это нарисовать одну линию, когда у вас есть несколько вертикальных или горизонтальных линий в одном месте. Если значения x из строки близки друг к другу, то линия является вертикальной, и, более того, если значения x из нескольких строк расположены близко друг к другу (в пределах некоторого порога, скажем, 20 пикселей), то они представляют одну и ту же линию. Однако лучшим методом может быть вычисление пересечений всех линий и рисование линий с использованием этих точек. См. мой ответ здесь, например.   -  person alkasm    schedule 26.08.2017