遍历Mat时发生NullpointerException

时间:2020-02-12 16:59:58

标签: java opencv nullpointerexception chaincode

我目前正在尝试遍历Java OpenCV 4.1.2中黑白图像的每个像素,并为每个像素存储e 3x3矩阵,如果当前使用的像素具有e个相邻像素,则该像素应为1像素,如果此位置没有邻居,则为0。因此,Mat中心的值应始终为1。当前,我正在使用嵌套的for循环,该循环应遍历Mat。

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

如代码中的注释所标记,im第一次检查x + 1处的像素时会收到NullPointer异常。而且我不明白为什么。

我的总体目标是计算一些轮廓的弗里曼链代码,我希望以某种方式实现它。自从OpenCV从findContours()函数中删除Freeman链代码以来,它们还有其他选择吗?

对这两个问题的任何帮助均深表感谢。谢谢。

0 个答案:

没有答案
相关问题