cv:OutOfMemoryError Java 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字节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
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);