bytedeco / javacv

Java interface to OpenCV, FFmpeg, and more
Other
7.42k stars 1.57k forks source link

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

Open zhangruolong opened 11 months ago

zhangruolong commented 11 months ago
    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;
    }
saudet commented 11 months ago

Please use Java2DFrameConverter instead of Java2DFrameUtils.

zhangruolong commented 11 months ago

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;
    }
}
saudet commented 11 months ago

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

zhangruolong commented 11 months ago

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

ok. but thread safe ?

saudet commented 11 months ago

No, not thread safe.

zhangruolong commented 11 months ago

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 ?

saudet commented 11 months ago

Please use a profiler to find out