Повреждение кучи с помощью OpenCV C++ HOG Detector
Привет, сообщество stackru,
Я разрабатывал алгоритм с использованием библиотеки OpenCV. У меня не было проблем с памятью до сих пор, когда я интегрировал алгоритм в приложение. Я не очень опытен в C++ и "правильном кодировании", поэтому я не знаю, что может вызвать проблему.
Ошибка, которую я получаю, когда выпускаю код, является типичным "повреждением кучи". В приведенном ниже коде вы можете увидеть функцию, в которой я получаю точку останова.
Я думаю, что проблема связана с моим Mat temptemp. В этой функции я отправляю Mat как параметр, затем копирую этот Mat во временный Mat и работаю с ним (обнаружение людей на изображении и маркировка прямоугольника на них). Наконец я возвращаю этот временный коврик. Должно быть что-то не так с распределением / освобождением памяти этих матов, но я не могу найти ответ на этот вопрос. Все, что не так в моем коде, может помочь мне решить точку останова. Заранее спасибо за ответ.
Mat predetection(Mat &frame){
Mat rois;
Mat frametemp;
frame.copyTo(frametemp);
// HOG for people detections
HOGDescriptor hog;
static vector<float> detector = HOGDescriptor::getDefaultPeopleDetector();
if (!detector.size()) {
fprintf(stderr, "ERROR: getDefaultPeopleDetector returned NULL\n");
}
hog.setSVMDetector(detector);
fflush(stdout);
vector<Rect> found, found_filtered;
vector<double> foundWeights, foundWeights_filtered;
// run the detector with default parameters. to get a higher hit-rate
// (and more false alarms, respectively), decrease the hitThreshold and
// groupThreshold (set groupThreshold to 0 to turn off the grouping completely).
hog.detectMultiScale(frametemp, found, foundWeights, 0, Size(8, 8), Size(32, 32), 1.05, 2);
size_t i, j;
for (i = 0; i < found.size(); i++)
{
Rect r1 = found[i];
double prescore = foundWeights[i];
for (j = 0; j < found.size(); j++)
if (j != i && (r1 & found[j]) == r1)
break;
if (j == found.size()){
found_filtered.push_back(r1);
foundWeights_filtered.push_back(prescore);
}
}
for (i = 0; i < found_filtered.size(); i++)
{
Rect r2 = found_filtered[i];
double prescore_filtered = foundWeights_filtered[i];
int x1, y1, x2, y2;
x1 = r2.x;
y1 = r2.y;
x2 = r2.x + r2.width;
y2 = r2.y + r2.height;
// the HOG detector returns slightly larger rectangles than the real objects.
// so we slightly shrink the rectangles to get a nicer output.
r2.x += cvRound(r2.width*0.1);
r2.width = cvRound(r2.width*0.8);
r2.y += cvRound(r2.height*0.07);
r2.height = cvRound(r2.height*0.8);
rectangle(frametemp, r2.tl(), r2.br(), cv::Scalar(255, 0, 0), 1);
}
return frametemp;
}
И это стек вызовов:
ntdll.dll!_RtlpBreakPointHeap@4() + 0x19 bytes
ntdll.dll!RtlpValidateHeapEntry() + 0x3088c bytes
ntdll.dll!_RtlDebugFreeHeap@12() + 0xbf bytes
ntdll.dll!RtlpFreeHeap() + 0x44b2f bytes
ntdll.dll!RtlFreeHeap() + 0x1ba bytes
msvcr100.dll!free(void * pBlock) Line 51 C
DiVA_detector3.exe!predetection(cv::Mat & frame) Line 70 + 0x9e bytes C++
1 ответ
Ваш Mat
класс имеет соответствующий и правильный конструктор копирования? Он вызывается, когда вы делаете return frametemp
и если есть ошибка, вы можете получить такие проблемы.