Как рассчитать точки пересечения на основе углов и количества ячеек - PullRequest
1 голос
/ 27 марта 2019

Я пытаюсь найти все точки пересечения (их значения x и y) на основе 4 угловых точек, которые у меня всегда есть, и количества ячеек (в моем случае 9, поэтому матрица 9x9, головоломка судоку).

Мои 4 угла отмечены зеленым крестом и помечены буквами от P1 до P4. Я попытался вычислить это, и мне удалось сделать это только для первого ряда.

double xDis = p2.x - p1.x;
double yDis = p2.y - p1.y;
double xW = xDis / 9;
double yH = yDis / 9;
for (int i = 0; i < 10; i++) {
    Point point = new Point(p1.x + (i * xW), p1.y + (i * yH));
}

Этот код будет работать точно так, как я ожидал, но только для первой строки. Что мне здесь не хватает? Есть ли какой-то алгоритм, который уже делает это? Любые намеки приветствуются. Обратите внимание, что я использую Android с библиотекой OpenCV.

points

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Как написано выше в комментариях, я закончил деформировать изображение, а затем вырезать его.Это выглядит примерно так

if (points != null) {
        Point p1 = points[0];
        Point p2 = points[1];
        Point p3 = points[2];
        Point p4 = points[3];

        MatOfPoint2f src = new MatOfPoint2f(
                p1,
                p2,
                p3,
                p4);

        drawMarker(frame, p1, new Scalar(255,0,0), 0, 20, 1);
        drawMarker(frame, p2, new Scalar(255,0,0), 0, 20, 1);
        drawMarker(frame, p3, new Scalar(255,0,0), 0, 20, 1);
        drawMarker(frame, p4, new Scalar(255,0,0), 0, 20, 1);

        double x = p2.x - p1.x;
        double y = p3.y - p2.y;

        MatOfPoint2f dst = new MatOfPoint2f(
                new Point(0, 0),
                new Point(x,0),
                new Point(0,y),
                new Point(x,y)
        );

        Mat warpMat = Imgproc.getPerspectiveTransform(src, dst);
        //This is you new image as Mat
        Mat destImage = new Mat();
        Imgproc.warpPerspective(bw2, destImage, warpMat, new Size(x, y));

        List<Mat> cells = getCells(destImage, destImage.width() / 9, destImage.height / 9);


    }



private List<Mat> getCells(Mat m, int width, int height) {

    Size cellSize = new Size(width, height);
    List<Mat> cells = new ArrayList<>();

    for (int row = 0; row < 9; row++) {
        for (int col = 0; col < 9; col++) {
            Rect rect = new Rect(new Point(col * width, row * height), cellSize);

            Mat digit = new Mat(m, rect).clone();
            cells.add(digit);
        }
    }

    return cells;
}
0 голосов
/ 27 марта 2019

Вы производите вычисления только один раз, в первом ряду

Поместите свой цикл for в другой цикл for и запустите его 10 раз, и у вас все получится (добавление любого преобразования x, y происходит при переходе вниз по y).

А если есть какой-нибудь автоматизированный способ сделать это, да.Я мог бы предложить использовать Обнаружение угла Харриса .Я подозреваю, что использование правильных порогов может дать вам только более толстые углы линий.Вы также можете попробовать обнаружить линии и найти пересечения.

Кроме того, эта статья может оказаться полезной, если вы обнаружите, что не находите хороших линий / углов.Вы можете исправить затенение от освещения и получить хорошее чистое изображение для анализа.

...