2013-03-10 9 views
5

Я пытаюсь создать программу, которая делает снимок с веб-камеры, а затем изменяет его размеры, преобразует его в 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

+0

И небольшое обновление, если я ставлю только граббер в свою собственную (истинную) петлю, утечки памяти нет. Так что это, вероятно, не проблема Framegrabber, которая вызывает проблему. –

+0

Если вы запустите 'jmap -dump: format = b, file = ' (см. [Здесь] (http://docs.oracle.com/javase/6/docs/technotes/tools/share/jmap.html)), и отправьте свалку где-нибудь в форме на молнии, я посмотрю на нее. –

+0

Я только что загрузил файл дампа. Вы можете скачать это здесь. http://speedy.sh/eaJ7a/javadump.zip –

ответ

1

Из вашего дампа кучи, используемая память всех байт и ИНТ массивы, на которые ссылаются с машинным кодом. Глядя на ваш код, я вижу, что вы вызываете только cvReleaseImage для клонированного изображения, а не для исходного изображения.

+0

Да, правильно, причина в том, что в документации для FrameGrabbers сказано, что изображение не должно быть выпущено, это делается самим захватчиком. –

+0

В любом случае это память, выделенная из собственной библиотеки, поэтому она, вероятно, связана с невыпущенными изображениями. –

+0

Вот что я и думал. Но дело в том, что если я загружаю изображение и выполняю обработку этого статического изображения, а не хватаю новый кадр все время, у меня все еще есть утечка памяти, однако это «всего» около 30 мб/сек. –