Я разрабатываю приложение OMR (Optical Mark Recognition) с использованием JavaCV, java-интерфейса для OpenCV. Приложение работает отлично для 200 изображений, но после этого не удается выделить память для IplImage в моем коде Ошибка распределения возникает, когда я пытаюсь клонировать imgx и назначать его imgxc1.Кажется, вы предлагаете программное исправление для него? Увеличение размера кучи кажется временным решением?JavaCV Недостаточно памяти, не удалось выделить память
Вот код инициализации (где происходит исключение):
protected boolean init() throws UnableToLoadImage{
imgx = new IplImage();
imgxc1 = new IplImage();
imgxd1 = new IplImage();
imgx = cvLoadImage(path+DR+filename);
if(imgx == null)throw new UnableToLoadImage(path+DR+filename);
//cvSaveImage("debug/"+filename, imgx);
imgxc1 = cvCreateImage(cvGetSize(imgx), imgx.depth(), imgx.nChannels());
imgxc1 = imgx.clone();//error comes here
imgxd1 = cvCreateImage(cvGetSize(imgx), IPL_DEPTH_8U, 1);
cvCvtColor(imgxc1, imgxd1, CV_BGR2GRAY);
return (imgx != null && imgxc1 != null && imgxd1 != null)?true:false;
}
Вот очистки код:
public void release() {
if(imgx != null){
imgx.release();
imgxc1.release();
imgxd1.release();
cvReleaseImage(imgx);
cvReleaseImage(imgxc1);
cvReleaseImage(imgxd1);
}
}
Стек след:
OpenCV Error: Insufficient memory (Failed to allocate 6454368 bytes) in cv::OutOfMemoryError, file ..\..\..\..\opencv\modules\core\src\alloc.cpp, line 52
at org.bytedeco.javacpp.opencv_core.cvCloneImage(Native Method)
at org.bytedeco.javacpp.helper.opencv_core$AbstractIplImage.clone(opencv_core.java:1005)
at com.omr.app.OmrModel.init(OmrModel.java:200)
at com.omr.app.OmrController$2.doInBackground(OmrController.java:328)
at com.omr.app.OmrController$2.doInBackground(OmrController.java:1)
at javax.swing.SwingWorker$1.call(Unknown Source)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at javax.swing.SwingWorker.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Ошибка выглядит так, что проблема не была достигнута, но недостаточно RAM - Java захотела выделить больше, но ОС не смогла дать больше. –
, когда эта ошибка возникла, баран был равен 80 процентам от общего количества 4 ГБ. Это не похоже на проблему с бараном. Приложение занимало 340 мб в диспетчере задач, когда счетчик страниц составлял 200. – afnan1992
Это явно проблема с ОЗУ, и, как сказал @JiriTousek, а не куча Java, так что увеличение размера кучи даже не поможет. – Kayaman