Я программирую фильтр DirectShow, который обнаруживает объекты с OpenCV HaarcascadeClassifier
. Он отлично работает в режиме отладки, но не в режиме Release, и я не уверен, есть ли утечка памяти в функции OpenCV (двоичная версия VC 2010 из opencv_249 libs) или что-то не так с моим проектом (настройками).Ошибка отладки - DirectShow Filter, вызывающий функцию OpenCV - только режим освобождения
Я загружаю фильтр в 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 в режиме выпуска, я получаю следующее сообщение об ошибке ПОСЛЕ вся функция прекращается (так, вероятно, где-то еще внутри DirectShow Filtergraph):
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
циклом, который случайным образом (ранее посеянным со временем (NULL)) вставляет cv::Rect
объектов в вектор. Фильтр не разбивается и отображает случайные прямоугольники так, как я предполагал.
Я читал, что другие наблюдали (valgrind) cv::CascadeClassifiert::detectMultiScale
для получения утечек памяти. И я нашел ссылку, где у кого-то была проблема с detectSingleScale
, а некоторые коммиттеры OpenCV отметили ее исправление (http://code.opencv.org/issues/2628).
Вопросы:
Есть ли шанс, что это точная проблема (см предыдущую ссылку) (все еще) в detectMultiScale
?
Есть ли вероятность, что проблема не в моем проекте, а в библиотеке OpenCV?
Почему эта проблема возникает только в режиме деблокирования?
Почему эта проблема возникает только в фильтре DirectShow? (если я запускаю «тот же» код/функциональность в режиме Release в автономном проекте, я не получаю Debug Assert Failed
ошибок - хотя может быть непризнанное повреждение памяти?!?).
Надеюсь, у кого-то есть идея и thx заранее!
EDIT:
нормально ... Я связала против msvcrtd.lib
... удалили всю экспромты из моего проекта (кажется, я не сделал даже нужно) и «работает» теперь ... Eсть вопрос остался, есть ли какая-то утечка памяти. Или связывает ли это с единственной проблемой?