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以得到每个像素的平均值。我怎样才能避免我收到的这个错误。谢谢你的帮助。
1条答案
按热度按时间7cwmlq891#
原因是每次调用getrgb时,您都会再次加载图像。。。它一次又一次地为main循环中的每个像素分配921600字节(可能是640x480x3)。您必须将图像作为参数发送到函数,作为在main中创建的mat的引用,而不是每次都加载图像。
显然,在getrgb中创建的这些示例不会被释放,内存负载会不断增加,直到系统内存耗尽(根据您的操作系统,使用任务管理器、htop等观看)
不是主要的问题,但是使用double是一种过度杀戮,值将<=255,整数除法和字节也足够了。