javacv
javacv copied to clipboard
when use javavc the memory is always grow up, the version is 4.5.5-1.5.7
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;
}
Please use Java2DFrameConverter instead of Java2DFrameUtils.
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;
}
}
Please keep Java2DFrameConverter and OpenCVFrameConverter in fields. Don't recreate them at each iteration.
Please keep Java2DFrameConverter and OpenCVFrameConverter in fields. Don't recreate them at each iteration.
ok. but thread safe ?
No, not thread safe.
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 ?
Please use a profiler to find out