5

私は、ウェブカメラから写真を撮り、その後サイズを変更し、HSV に変換し、特定の色を見つけるためにしきい値を設定するプログラムを作成しようとしています。これが完了したら、しきい値処理された画像を使用して輪郭を見つけ、さまざまな輪郭の x、y 座標を出力します。これを何度も繰り返して、ウェブカメラからの処理をリアルタイムにします。

実行する 2 秒ごとに約 100 MB の RAM を使い果たしているという事実を除いて、すべてが非常にうまく機能します。

これまでのところ、Web カメラからのライブ画像の代わりに静止画像を使用すると、メモリ リークを大幅に最小限に抑えることができることがわかりましたが、それでもメモリが消費されています。

私のコードの下には:

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 は、次のような javacv の標準的な frameGrabber です。

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;
}

助けていただければ幸いです。さらに情報が必要な場合は、お気軽にお尋ねください。

/ジェスパー

4

1 に答える 1

1

ヒープ ダンプから、使用されたメモリはすべて、ネイティブ コードから参照される byte および int 配列です。あなたのコードを見るとcvReleaseImage、元のイメージではなく、複製されたイメージのみを呼び出していることがわかります。

于 2013-03-11T10:08:39.960 に答える