javacv icon indicating copy to clipboard operation
javacv copied to clipboard

when use javavc the memory is always grow up, the version is 4.5.5-1.5.7

Open zhangruolong opened this issue 1 year ago • 7 comments

    try (PointerScope scope = new PointerScope()) {

        Mat image = Java2DFrameUtils.toMat(bufferedImage);
        Mat grayImage = new Mat(image.rows(), image.cols(), opencv_core.CV_8UC1);
        opencv_imgproc.cvtColor(image, grayImage, opencv_imgproc.COLOR_BGR2GRAY);

        Mat dest = new Mat(image.rows(), image.cols(), opencv_core.CV_8UC1);
        int rows = image.rows();
        int cols = image.cols();
        image.release();

        opencv_core.addWeighted(grayImage, 1.3, dest, -0.5, 0, dest);
        Mat edges = new Mat(rows, cols, opencv_core.CV_8UC1);
        opencv_imgproc.Canny(dest, edges, 50, 150);

        Mat destNoiseFree = new Mat(rows, cols, opencv_core.CV_8UC1);
        opencv_imgproc.medianBlur(dest, destNoiseFree, 5);

        BufferedImage outputImage = Java2DFrameUtils.toBufferedImage(dest);

        grayImage.release();
        edges.release();
        destNoiseFree.release();
        dest.release();
        return outputImage;
    }

zhangruolong avatar Jul 31 '23 09:07 zhangruolong

Please use Java2DFrameConverter instead of Java2DFrameUtils.

saudet avatar Jul 31 '23 09:07 saudet

Please use Java2DFrameConverter instead of Java2DFrameUtils.

i try it but the memory still grow up . the code is: public static BufferedImage processImage(BufferedImage bufferedImage) { // PointerScope 会自动调用Pointer对象的deallocate()方法来进行内存清理 Java2DFrameConverter java2dConverter = new Java2DFrameConverter(); OpenCVFrameConverter.ToMat matConverter = new OpenCVFrameConverter.ToMat(); try (PointerScope scope = new PointerScope()) { // 将BufferedImage转为Mat Frame frame = java2dConverter.convert(bufferedImage); // 将Frame转为Mat Mat image = matConverter.convert(frame); // 创建新的Mat来存储灰度图像 Mat grayImage = new Mat(image.rows(), image.cols(), opencv_core.CV_8UC1); opencv_imgproc.cvtColor(image, grayImage, opencv_imgproc.COLOR_BGR2GRAY); // 创建新的Mat来做之后的处理 Mat dest = new Mat(image.rows(), image.cols(), opencv_core.CV_8UC1); int rows = image.rows(); int cols = image.cols(); image.release(); // 将原图与模糊后的图像进行加权,得到锐化的结果 opencv_core.addWeighted(grayImage, 1.3, dest, -0.5, 0, dest); // 边缘检测算法 有助于增强字体的边界 Mat edges = new Mat(rows, cols, opencv_core.CV_8UC1); opencv_imgproc.Canny(dest, edges, 50, 150);

        // 应用中值滤波进行去噪
        Mat destNoiseFree = new Mat(rows, cols, opencv_core.CV_8UC1);
        opencv_imgproc.medianBlur(dest, destNoiseFree, 5);

        // 将处理后的dest Mat转为Frame
        Frame processedFrame = matConverter.convert(dest);
        // 将Frame转为BufferedImage
        BufferedImage outputImage = java2dConverter.convert(processedFrame);

        grayImage.release();
        edges.release();
        destNoiseFree.release();
        dest.release();
        return outputImage;
    }
}

zhangruolong avatar Jul 31 '23 10:07 zhangruolong

Please keep Java2DFrameConverter and OpenCVFrameConverter in fields. Don't recreate them at each iteration.

saudet avatar Jul 31 '23 10:07 saudet

Please keep Java2DFrameConverter and OpenCVFrameConverter in fields. Don't recreate them at each iteration.

ok. but thread safe ?

zhangruolong avatar Jul 31 '23 10:07 zhangruolong

No, not thread safe.

saudet avatar Jul 31 '23 11:07 saudet

Please keep Java2DFrameConverter and OpenCVFrameConverter in fields. Don't recreate them at each iteration.

not valid. when i use processimage method the memory from 1090.16 MB to 1626.78 MB. and the system is free the memory still not reduce. Where is the memory leak ?

zhangruolong avatar Jul 31 '23 11:07 zhangruolong

Please use a profiler to find out

saudet avatar Jul 31 '23 13:07 saudet