cv:OutOfMemoryError Java IplImage

cv:OutOfMemoryError Java IplImage,java,opencv,memory,javacv,iplimage,Java,Opencv,Memory,Javacv,Iplimage,我一直在写一个运动检测程序,目前有一个错误(内存不足) OpenCV错误:cv::OutOfMemoryError文件……。\OpenCV\modules\core\src\alloc.cpp第52行中的内存不足(分配836352字节失败) java.lang.RuntimeException:…..\opencv\modules\core\src\alloc.cpp:52:错误:(-4)未能在函数cv::OutOfMemoryError中分配836352字节 at com.googlecode

我一直在写一个运动检测程序,目前有一个错误(内存不足)

OpenCV错误:cv::OutOfMemoryError文件……。\OpenCV\modules\core\src\alloc.cpp第52行中的内存不足(分配836352字节失败) java.lang.RuntimeException:…..\opencv\modules\core\src\alloc.cpp:52:错误:(-4)未能在函数cv::OutOfMemoryError中分配836352字节

at com.googlecode.javacv.cpp.opencv_core.cvCreateImage(Native Method)
at cv.MotionDetectionUtil.resizeIplImage(MotionDetectionUtil.java:170)
at cv.MotionDetectionUtil.grabFrame(MotionDetectionUtil.java:87)
at applet.Panel$2.run(Panel.java:153)
at java.lang.Thread.run(Thread.java:744)
以上是我得到的错误。他们指的是以下地点

首先是这个。参考createImage行

 private IplImage resizeIplImage(IplImage img, double percent) {
    double width = ((double) img.width() * percent) / 100;
    double height = ((double) img.height() * percent) / 100;

    IplImage dest_img;

    dest_img = opencv_core.cvCreateImage(
            opencv_core.cvSize((int) width, (int) height), img.depth(),
            img.nChannels());

    //resize the image
    opencv_imgproc.cvResize(img, dest_img, opencv_imgproc.CV_INTER_CUBIC);

    return dest_img;
}
第二行:

 if (REDUCE_TO_PERCENT > 0 && REDUCE_TO_PERCENT != 100) {
        lastImage = resizeIplImage(img, REDUCE_TO_PERCENT);
    } else {
        lastImage = img;
    }
最后,这篇文章的第一行

//update the image
                    img = detector.grabFrame(brightness, contrast);
                    image = img;
                    CameraPanel.updateImage(image);
我一辈子都无法解决这个问题,有人能告诉我(细节)我做错了什么吗?(最好是举个例子)。我是java新手(尤其是opencv等)


谢谢。

原始图像在内存中有多大?H*W*比特像素?不知道如何检查?但它来自我的ip摄像头,使用RTSP读取图像,然后调整大小以适应屏幕。如果您可以将文件写入磁盘,Windows资源管理器只需将鼠标悬停在图像上即可告诉您h*w。您调用resizeIplImage()多少次?它是在循环中调用的吗?如果您从视频中抓取帧,然后尝试调整它们的大小,那么内存不足也就不足为奇了。所有内容都需要立即解压缩。如果您实时运行它,可能会很快耗尽内存。它在循环中被调用,它会调整每个帧的大小,然后再将其放到我的Jframe中。。如果你看第二段代码,它基本上会调用该函数来调整每一帧的图像大小。你会很快耗尽内存。为什么不只是全尺寸显示它,而是调整它所显示的容器的大小?我不确定你用的是什么软件包,但你正在解压视频,并为每一帧创建一个单独的图像。那是没有效率的。
//update the image
                    img = detector.grabFrame(brightness, contrast);
                    image = img;
                    CameraPanel.updateImage(image);