Повреждение кучи с помощью 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и если есть ошибка, вы можете получить такие проблемы.

Другие вопросы по тегам