Java OPENCV 和 Splitting Mat into many sub images for object detection

问题描述 投票:0回答:0

我正在开发一个应用程序,它获取一个视频文件,在一个单独的线程上以 30FPS 的速度在 jframe 上播放视频文件,然后以固定的时间间隔在另一个线程上将图像拆分几次,以处理来自大文件的一些信息框架。播放视频效果很好。当我开始尝试拆分帧时,我开始出现内存泄漏并导致崩溃。帧大小为 1440x896。现在我正在使用计时器来处理分割视频:

new Thread()
{
    public void run()
    {
        Timer timer = new Timer();         
        timer.scheduleAtFixedRate(new TimerTask() {
                @Override
                public void run() {
                    try
                    {
                        System.out.println("Calling Update Logic");
                         if (frame == null)
                        return;
        
            Mat tables = frame;
            Runnable splitter = new Splitter(tables);
            Thread splitterThread = new Thread(splitter);
            splitterThread.start();
            tables = null;
                       
                    }
                    catch(Exception gf){gf.printStackTrace();}
                
                }
              }, 100, 100);
            }
        }.start();
    
    

Splitter 然后抓取屏幕的 4 个区域,每个区域的大小为 575 x 426。然后通过从不同位置拉出大约 10-15 个东西来使用这 4 个区域进一步处理特定区域。这些范围从 10x50 到 35-60。这些拆分中的每一个都在单独的线程上处理。在这个单独的线程上,它获取感兴趣区域并创建一个新的

BufferedImage
并将随机背景与感兴趣区域相结合,以便可以将其提交给网络进行检测。网络尺寸为 96x96。所以它是一个相当小的图像。
它可以正常工作一段时间,但随后开始在内存中增长。我试过在垫子上调用
.release()
并将它们设置为
null
但它仍然有同样的问题,它会消耗内存直到达到其限制并且应用程序停止。

当我尝试分析时,堆转储显示很多

byte[]
。我之前没有做过太多分析,这是我第一次在 Java 中看到这种内存泄漏,所以我有点难过。

这里是转储:

Current thread (0x00007fec980032a0):  JavaThread "pool-349-thread-2" [_thread_in_native, id=242197, stack(0x00007fe8a5f00000,0x00007fe8a6000000)]

Stack: [0x00007fe8a5f00000,0x00007fe8a6000000],  sp=0x00007fe8a5ffe130,  free space=1016k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [libopencv_dnn.so.3.4+0x162171]  cv::dnn::experimental_dnn_34_v21::Net::Impl::forwardLayer(cv::dnn::experimental_dnn_34_v21::LayerData&)+0xc61

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
J 2836  org.opencv.dnn.Net.forward_4(JJLjava/util/List;)V (0 bytes) @ 0x00007ffa50ef1700 [0x00007ffa50ef16a0+0x0000000000000060]
J 2937 c1 org.opencv.dnn.Net.forward(Ljava/util/List;Ljava/util/List;)V (30 bytes) @ 0x00007ffa49f5450c [0x00007ffa49f54380+0x000000000000018c]
J 2655 c2 watcher.ai.Detect.call()Lwatcher/data/Card; (597 bytes) @ 0x00007ffa50eda1f0 [0x00007ffa50ed9fa0+0x0000000000000250]
J 2801 c1 watcher.ai.Detect.call()Ljava/lang/Object; (5 bytes) @ 0x00007ffa49f01a44 [0x00007ffa49f019c0+0x0000000000000084]
J 2005 c1 java.util.concurrent.FutureTask.run()V [email protected] (123 bytes) @ 0x00007ffa49d5b69c [0x00007ffa49d5aec0+0x00000000000007dc]
J 2431 c1 java.util.concurrent.ThreadPoolExecutor.runWorker(Ljava/util/concurrent/ThreadPoolExecutor$Worker;)V [email protected] (187 bytes) @ 0x00007ffa49e204ac [0x00007ffa49e1fba0+0x000000000000090c]
J 2430 c1 java.util.concurrent.ThreadPoolExecutor$Worker.run()V [email protected] (9 bytes) @ 0x00007ffa49e1e4bc [0x00007ffa49e1e440+0x000000000000007c]
J 1938 c1 java.lang.Thread.run()V [email protected] (17 bytes) @ 0x00007ffa49d2a204 [0x00007ffa49d2a0c0+0x0000000000000144]
v  ~StubRoutines::call_stub

siginfo: si_signo: 11 (SIGSEGV), si_code: 1 (SEGV_MAPERR), si_addr: 0x0000000000000019

有什么建议吗?

java opencv memory-leaks bufferedimage mat
© www.soinside.com 2019 - 2024. All rights reserved.