如何在OpenCV Java中使用get(int rows,int cols)获取灰度垫图像的像素值?

时间:2019-05-21 08:55:13

标签: java android opencv

我正在Android Studio中构建文档扫描器应用程序,以演示我最近提出的算法。但是,在创建“ maxFilter”函数时遇到了问题,该函数应返回图像的每个n x n块的最大值。

由于我是Android Studio的新手,所以我尝试了与中值过滤器相同的编码结构:将Mat转换为1d数组>在每个窗口中查找最大值并另存为数组>将1d数组转换为Mat。

private Mat maxFilter(Mat src, int windowSize) {

    Mat max = new Mat();
    int size = (int) (src.total());
    double[] d = new double[size];
    double window[];

    for (int j = 0; j < src.rows(); j++){
        for (int i = 0; i < src.cols(); i++){
            window = new double [windowSize * windowSize];
            int count = 0;
            for (int r = j - (windowSize / 2); r <= j + (windowSize / 2); r++){
                for (int c = i - (windowSize / 2); c <= i + (windowSize / 2); c++) {
                    if (r < 0 || r >= src.rows() || c < 0 || c >= src.cols()) {
                        /** Some portion of the mask is outside the image. */
                        window[count] = 0;
                    } else {
                        window[count] = src.get(c, r)[0];
                    }
                    count++;
                }

            }
            java.util.Arrays.sort(window);
            d[i + j * src.cols()] = window[(windowSize*windowSize)-1];
        }
    }
    for(int j = 0; j < src.rows(); j++) {
        for (int i = 0; i < src.cols(); i++) {
            src.put(i, j, d[i + j * src.cols()]);
            Core.divide(src, new Scalar(255), max);
        }
    }
    return max;

}

编辑器中没有显示错误消息,但是在实际电话上运行时,logcat中显示了致命异常。

  

java.lang.NullPointerException:尝试从空数组读取           在com.myapps.documentscanner.ImageProcessor.maxFilter(ImageProcessor.java:382)

指向行window[count] = src.get(c, r)[0];

0 个答案:

没有答案