【问题标题】:Memory leaking using OpenCV CascadeClassifier使用 OpenCV CascadeClassifier 的内存泄漏
【发布时间】:2015-02-23 00:54:45
【问题描述】:

我正在编写一个使用 PCL kinfu 的程序,并且我正在使用 openCV 人脸检测。我遇到了一些堆问题,所以我隔离了 openCV 的代码来尝试检查问题是否在那里。在注释掉几乎所有内容后,我遇到了一些奇怪的事情。 'CascadeClassifier' 类只有一个全局声明,它会导致 valgrind 对可能丢失但仍可访问的块发出警报。注释掉这个声明可以正常工作。我真的不确定发生了什么,并希望得到任何帮助。 我附上了我有问题的代码(没有注释掉的部分)。 谢谢!

#include "opencv2/objdetect/objdetect.hpp"

using namespace cv;
CascadeClassifier c;

int main() {
    return 0;
}

**Valgrind output:**
==3316== Memcheck, a memory error detector
==3316== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==3316== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
==3316== Command: ./test
==3316== 
==3316== 
==3316== HEAP SUMMARY:
==3316==     in use at exit: 297,370 bytes in 1,393 blocks
==3316==   total heap usage: 3,446 allocs, 2,053 frees, 655,130 bytes allocated
==3316== 
==3316== LEAK SUMMARY:
==3316==    definitely lost: 0 bytes in 0 blocks
==3316==    indirectly lost: 0 bytes in 0 blocks
==3316==      possibly lost: 4,676 bytes in 83 blocks
==3316==    still reachable: 292,694 bytes in 1,310 blocks
==3316==         suppressed: 0 bytes in 0 blocks
==3316== Rerun with --leak-check=full to see details of leaked memory
==3316== 
==3316== For counts of detected and suppressed errors, rerun with: -v
==3316== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

【问题讨论】:

    标签: c++ opencv valgrind cascade-classifier


    【解决方案1】:

    对我来说有两种可能的解释:

    1. 如果您信任 Valgrind - opencv 代码中可能存在一些泄漏,因此应该有人从 opencv 开发人员那里对其进行更详细的调查(您为什么不针对该问题创建适当的票证?)

    1. 没有任何泄漏,因为那里显然有“可能”字样。然后你就不应该太在意了。在您注释掉一些代码之前,您一开始遇到了什么样的堆问题?

    顺便说一句,不建议在全局范围(静态内存)中使用不是 POD(普通旧数据)的类。将 CascadeClassifier 对象移动到本地作用域(main())时是否有同样的问题?

    【讨论】:

    • 问题是堆损坏,我试图隔离问题。我认为它可能来自 OpenCV 代码,但现在我怀疑它在 PCL 中。顺便说一句,我在各个地方读到 valgrind '可能丢失'应该被视为丢失字节,因为大多数时候它表明在其他地方泄漏。
    【解决方案2】:

    像这样再试一次:

    #include "opencv2/objdetect/objdetect.hpp"
    
    using namespace cv;
    
    void testmem() {
        CascadeClassifier c;
    }
    
    int main() {
        for (int i=0; i<10; i++)
            testmem();
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-12
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      • 2018-05-20
      相关资源
      最近更新 更多