如何解决javaopencv内存不足错误?

jfgube3f  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(648)
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import java.util.Arrays;

public class Main {

private static double getRGB(int i, int j) {
    Imgcodecs imageCodecs = new Imgcodecs();
    Mat matrix = imageCodecs.imread("/Users/brand/Downloads/SPACE.JPG");
    double rgbVal;
    double rgb[] = matrix.get(i, j);
    rgbVal = rgb[0] + rgb[1] + rgb[2];
    rgbVal = rgbVal / 3;

    return rgbVal;
}
public static void main(String[] args) {
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    Imgcodecs imageCodecs = new Imgcodecs();
    Mat matrix = imageCodecs.imread("/Users/brand/Downloads/SPACE.JPG");
    System.out.println("Image loaded");
    System.out.println("Image size : " + matrix.width() + " x " + matrix.height());
    double[][] rgb = new double[matrix.width()][matrix.height()];

    for (int i = 0; i < matrix.width(); i++) {
        for (int j = 0; j < matrix.height(); j++) {
            rgb[i][j] = getRGB(i, j);
        }
    }
    System.out.println(Arrays.deepToString(rgb));
}
}

当我运行程序时,需要很长时间才能完成,最后返回以下错误:
“线程中的异常”main“cvexception[org.opencv.core.cvexception:cv::exception:opencv(4.5.0)c:\build\master\winpack-bindings-win64-vc14-static\opencv\modules\core\src\alloc。cpp:73:错误:(-4:内存不足)无法在函数'cv::outofmemoryerror']中分配921600字节。“
代码的目标是检索每个像素的rgb值,将它们相加,然后将它们除以3以得到每个像素的平均值。我怎样才能避免我收到的这个错误。谢谢你的帮助。

7cwmlq89

7cwmlq891#

原因是每次调用getrgb时,您都会再次加载图像。。。它一次又一次地为main循环中的每个像素分配921600字节(可能是640x480x3)。您必须将图像作为参数发送到函数,作为在main中创建的mat的引用,而不是每次都加载图像。
显然,在getrgb中创建的这些示例不会被释放,内存负载会不断增加,直到系统内存耗尽(根据您的操作系统,使用任务管理器、htop等观看)
不是主要的问题,但是使用double是一种过度杀戮,值将<=255,整数除法和字节也足够了。

相关问题