【发布时间】:2014-09-18 12:57:02
【问题描述】:
我正在编写一个 DirectShow 过滤器,它使用 OpenCV HaarcascadeClassifier 检测对象。它在调试模式下工作正常,但在发布模式下不工作,我不确定 OpenCV 函数(opencv_249 库的 VC 2010 二进制文件)中是否存在内存泄漏或我的项目(设置)是否有问题。
我正在 GraphStudio 中加载过滤器,这是一个轻松构建 DirectShow FilterGraph 的工具。我不确定是否有关于要在调试模式下编译的过滤器 DLL 的假设。
经过一些预处理,我基本上是在做以下事情:
std::vector<cv::Rect> objects;
mClassifier.detectMultiScale(inputGray,objects, 1.3);
for(unsigned int i=0; i<objects.size(); ++i)
{
cv::rectangle(outputImage, objects[i], cv::Scalar(255,255,255));
}
所以我在功能块中进行预处理,然后是显示的代码部分,然后将数据写入 DirectShow 缓冲区。
如果我在发布模式下使用 DLL,我会收到以下错误消息 AFTER 整个函数终止(因此可能是 DirectShow 过滤器图内的其他地方):
Debug Assertion Failed!
Program: C:\Program Files (x86)\Graphstudio\graphstudio.exe
File: f:\dd\vctools\crt_bld\self_x86\crt\src\dbgdel.cpp
Line: 52
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
For information [...]
后跟一个
Debug Assertion Failed!
Program: C:\Program Files (x86)\Graphstudio\graphstudio.exe
File: f:\dd\vctools\crt_bld\self_x86\crt\src\dbgdel.cpp
Line: 1322
Expression: _CrtlsValidHeapPointer(pUserData)
当我评论 mClassifier.detectMultiScale(inputGray,objects, 1.3); 时,过滤器不会崩溃。虽然有些事情可能会被优化掉,但我将 detectMultiScale 调用替换为一个循环,该循环随机(之前以 time(NULL) 为种子)将 cv::Rect 对象插入向量中。过滤器不会崩溃并以我假设的方式显示随机矩形。
我读到其他人观察到 (valgrind) cv::CascadeClassifiert::detectMultiScale 会产生内存泄漏。而且我找到了一个链接,其中有人对detectSingleScale 有问题,并且一些 OpenCV 提交者将其标记为已修复(http://code.opencv.org/issues/2628)。
问题:
这个确切的问题(参见上一个链接)是否有可能(仍然)在detectMultiScale 中?
有没有可能问题不在我的项目中,而是在 OpenCV 库中?
为什么这个问题只出现在Release模式下?
为什么这个问题只出现在 DirectShow 过滤器中? (如果我在独立项目中以发布模式运行“相同”代码/功能,我不会收到 Debug Assert Failed 错误 - 尽管可能存在无法识别的内存损坏?!?)。
希望有人有想法并提前谢谢!
编辑:
好的...我已经链接到msvcrtd.lib ...从我的项目中删除了整个库(似乎我什至不需要它)现在它“工作”了...还有一个问题,是否有某种内存泄漏。还是链接到那个库是唯一的问题?
【问题讨论】:
标签: c++ opencv memory-leaks directshow