Я пытаюсь создать программу, которая делает снимок с веб-камеры, а затем изменяет его размеры, преобразует его в HSV и создает для него определенный порог, чтобы найти определенный цвет. После этого я использую пороговое изображение для поиска контуров и печатаю координаты x, y разных контуров. Это повторяется снова и снова, чтобы сделать обработку с веб-камеры в реальном времени.Утечка памяти в javacv
Все работает хорошо, за исключением того факта, что я использую около 100 мб оперативной памяти каждые 2 секунды.
До сих пор я обнаружил, что если я использую статичное изображение вместо живых изображений с веб-камеры, я могу значительно уменьшить утечку памяти, хотя все еще есть потребляемая память.
Ниже мой код:
public class Application {
private CaptureImage ci;
private ImageUtils iu;
private CanvasFrame canvasContours;
IplImage grabbedFrame;
IplImage resizedFrame;
IplImage thresholdedFrame;
IplImage clonedImage;
public Application(){
ci = new CaptureImage();
iu = new ImageUtils();
canvasContours = new CanvasFrame("contours");
}
public void frameProcessing(){
grabbedFrame = ci.grabImage();
//below call used for testing purposes
//grabbedFrame = (IplImage) opencv_highgui.cvLoadImage("testingImage.jpg");
//cloning image due to highgui guidelines.
clonedImage = opencv_core.cvCloneImage(grabbedFrame);
resizedFrame = iu.resizeImage(clonedImage);
opencv_core.cvReleaseImage(clonedImage);
thresholdedFrame = iu.thresholdImage(resizedFrame);
IplImage contoursFrame = iu.findContours(thresholdedFrame, resizedFrame);
canvasContours.showImage(contoursFrame);
}
}
grabImage только стандарт Framegrabber от javacv, который выглядит следующим образом:
public class CaptureImage {
private final OpenCVFrameGrabber grabber;
private IplImage img = null;
public CaptureImage(){
// 0-default camera, 1 - next...so on
grabber = new OpenCVFrameGrabber(0);
try {
grabber.start();
} catch (Exception e) {
System.err.print("Failed to initialize camera");
e.printStackTrace();
}
}
public IplImage grabImage(){
try {
//A grabbed image from Logitech webcam is in following resolution: 1200x800px
img = grabber.grab();
} catch (Exception e) {
e.printStackTrace();
}
return img;
}
Я признателен за любую помощь вы можете дать мне, и если вы нужна дополнительная информация, пожалуйста, просто спросите!
/Jesper
И небольшое обновление, если я ставлю только граббер в свою собственную (истинную) петлю, утечки памяти нет. Так что это, вероятно, не проблема Framegrabber, которая вызывает проблему. –
Если вы запустите 'jmap -dump: format = b, file =' (см. [Здесь] (http://docs.oracle.com/javase/6/docs/technotes/tools/share/jmap.html)), и отправьте свалку где-нибудь в форме на молнии, я посмотрю на нее. –
Я только что загрузил файл дампа. Вы можете скачать это здесь. http://speedy.sh/eaJ7a/javadump.zip –