我正在编程一个DirectShow筛选器,该筛选器使用OpenCV HaarcascadeClassifier
检测对象。它在调试模式下工作正常,但在发布模式下工作不正常,我不确定OpenCV函数(OpenCV_249 libs的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缓冲区。
如果我在Release模式下使用DLL,我会收到以下错误消息AFTER整个函数终止(因此可能在DirectShow Filtergraph的其他地方):
Debug Assertion Failed!
Program: C:Program Files (x86)Graphstudiographstudio.exe
File: f:ddvctoolscrt_bldself_x86crtsrcdbgdel.cpp
Line: 52
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
For information [...]
然后是
Debug Assertion Failed!
Program: C:Program Files (x86)Graphstudiographstudio.exe
File: f:ddvctoolscrt_bldself_x86crtsrcdbgdel.cpp
Line: 1322
Expression: _CrtlsValidHeapPointer(pUserData)
当我把mClassifier.detectMultiScale(inputGray,objects, 1.3);
注释掉时,过滤器不会崩溃。尽管有些事情可能会被优化掉,但我用一个循环替换了detectMultiScale
调用,该循环随机(之前用时间(NULL)进行种子设定)将cv::Rect
对象插入到向量中。过滤器不会崩溃,并以我假设的方式显示随机矩形。
我读到其他人观察到(valgrind)cv::CascadeClassifiert::detectMultiScale
会产生内存泄漏。我发现了一个链接,其中有人对detectSingleScale
有问题,一些OpenCV提交者将其标记为已修复(http://code.opencv.org/issues/2628)。
问题:
这个确切的问题(见前面的链接)是否有可能(仍然)在detectMultiScale
中?
这个问题是否有可能不在我的项目中,而是在OpenCV库中?
为什么这个问题只在发布模式下发生?
为什么这个问题只出现在DirectShow筛选器中?(如果我在独立项目中以Release模式运行"相同"的代码/功能,我不会得到Debug Assert Failed
错误——尽管可能存在无法识别的内存损坏?!?)。
我希望有人有一个想法和thx提前!
编辑:
好的。。。我曾联系过msvcrtd.lib
。。。从我的项目中删除了整个lib(似乎我甚至不需要它),它现在"有效"了。。。剩下的问题是,是否存在某种内存泄漏。或者,与那个自由党的联系是唯一的全部问题吗?
好的。。。我链接了msvcrtd.lib…
从我的项目中删除了整个库(所以添加了默认的库?!?),它现在"工作"了。。。
剩下的问题是,是否存在某种内存泄漏。或者,与那个自由党的联系是唯一的全部问题吗?
愚蠢的我…