NullpointerException при переборе Mat - PullRequest
       15

NullpointerException при переборе Mat

0 голосов
/ 12 февраля 2020

В настоящее время я пытаюсь перебрать каждый пиксель черно-белого изображения в OpenCV 4.1.2 в Java и сохранить матрицу e 3x3 для каждого пикселя, которая должна иметь 1, если пиксель, с которым в данный момент работал, имеет Здесь есть соседний пиксель и 0, если в этой позиции нет соседа. Таким образом, значение в центре мата всегда должно быть 1. В настоящее время я работаю с вложенными циклами for, которые должны проходить через мат.

        Mat bwDrawing = new Mat(drawing.size(), CvType.CV_8UC3);
        Imgproc.cvtColor(drawing, bwDrawing, Imgproc.COLOR_RGB2GRAY);       

        List<MatOfInt> freemanChains = new ArrayList<>();

        for (double y = 2; y-2 < bwDrawing.size().height; y++) {
            for (double x = 2; x-2 < bwDrawing.size().width; x++) {
                MatOfInt freemanMat = new MatOfInt();
                if (bwDrawing.get((int)y-1, (int)x-1)[0] != 0) {
                    freemanMat.put(0, 0, 1);
                } else {
                    freemanMat.put(0,0, 0);
                }
                if (bwDrawing.get((int)y-1, (int)x)[0] != 0) {
                    freemanMat.put(0, 1, 1);
                } else {
                    freemanMat.put(0,1, 0);
                }
                if (bwDrawing.get((int)y-1, (int)x+1)[0] == 0) { //right here is the NullPointer Exception
                    freemanMat.put(0, 2, 1);
                } else {
                    freemanMat.put(0,2, 0);
                }
                if (bwDrawing.get((int)y, (int)x-1)[0] != 0) {
                    freemanMat.put(1, 0, 1);
                } else {
                    freemanMat.put(1,0, 0);
                }
                if (bwDrawing.get((int)y, (int)x)[0] != 0) {
                    freemanMat.put(1, 1, 1);
                } else {
                    freemanMat.put(1,1, 0);
                }
                if (bwDrawing.get((int)y, (int)x+1)[0] != 0) {
                    freemanMat.put(1, 2, 1);
                } else {
                    freemanMat.put(1,2, 0);
                }
                if (bwDrawing.get((int)y+1, (int)x-1)[0] != 0) {
                    freemanMat.put(2, 0, 1);
                } else {
                    freemanMat.put(2,0, 0);
                }
                if (bwDrawing.get((int)y+1, (int)x)[0] != 0) {
                    freemanMat.put(2, 1, 1);
                } else {
                    freemanMat.put(2,1, 0);
                }
                if (bwDrawing.get((int)y+1, (int)x+1)[0] != 0) {
                    freemanMat.put(2, 2, 1);
                } else {
                    freemanMat.put(2,2, 0);
                }
                freemanChains.add(freemanMat);
               // System.out.println(freemanMat.get(2, 2)[0]);
            }
        }

Как отмечено в комментарии в коде, я получаю исключение NullPointer в первый раз, когда проверяю пиксель в точке x + 1. И я не понимаю, почему.

Моя общая цель - вычислить Цепной код Freeman для некоторых контуров, и я надеюсь как-то достичь этого. Есть ли другие варианты в OpenCV для получения Цепного кода Freeman, так как они удалили его из функции findContours ()?

Любая помощь для обеих проблем очень ценится. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...