java opencv内存不足错误如何解决?

Posted

技术标签:

【中文标题】java opencv内存不足错误如何解决?【英文标题】:How to resolve java opencv insufficient memory error? 【发布时间】:2020-12-21 10:48:19 【问题描述】:
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: error: (-4:Insufficient memory) 无法在函数 'cv::OutOfMemoryError' 中分配 921600 字节 ]"

代码的目标是检索每个像素的 rgb 值,将它们加在一起,然后将它们除以 3 以获得每个像素的平均值。我怎样才能避免我收到的这个错误。感谢您的帮助。

【问题讨论】:

【参考方案1】:

原因是因为在每次调用 getRGB 时都会再次加载图像......它会一次又一次地为 main 循环中的每个像素分配那些 921600 字节(可能是 640x480x3)。您必须将图像作为参数发送给函数,对 Mat 的引用,在 main 中创建,而不是每次都加载图像。

显然这些在 getRGB 中创建的实例不会被释放,并且内存负载会增长,直到您用完系统内存。 (根据您的操作系统使用任务管理器、htop 等观看它)

不是主要问题,但使用 double 有点过头了,值将是

【讨论】:

以上是关于java opencv内存不足错误如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

内存不足怎么办

我出现内存不足错误,如何解决?Permgen 空间区域是啥意思?是啥原因造成的? [复制]

如何解决执行存储过程导致的内存不足错误?

如何解决 J2ME 中的“应用程序因内存不足而意外退出”错误

当我运行命令计划laravel时,如何解决“致命错误:内存不足...”?

内存不足opencv haartraining