0

我目前正在尝试在 Java 中迭代 OpenCV 4.1.2 中黑白图像的每个像素,并为每个像素存储 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]);
            }
        }

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

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

非常感谢对这两个问题的任何帮助。谢谢你。

4

0 回答 0