2015-06-10 3 views
3

Я использую OpenCV и CascadeClassifier::detectMultiScale для обнаружения лица. Моя проблема заключается в том, что это, по-видимому, вызывает повреждение памяти на выходе vector<Rect>. Вектор правильно заполнен Rect, но он вызывает сбой при удалении вектора.CascadeClassifier :: detectMultiScale не работает с C++

Это происходит только при компиляции сборки Debug. Сообщение об ошибке - это сообщение об ошибке «Отладка с ошибкой», что заставляет меня задаться вопросом, есть ли проблема в сборке релизов, а утверждение просто не проверяется.

Это может быть ошибка с OpenCV? Или это просто, что я делаю что-то неправильно с тем, как я обрабатываю свои векторы?

Следующий фрагмент кода показывает пример кода для воспроизведения ошибки:

#include <opencv2/opencv.hpp> 
using namespace cv; 

int main(array<System::String ^> ^args) 
{ 
    VideoCapture video(0); 
    Mat frame; 
    CascadeClassifier classifier("haarcascade_frontalface_default.xml"); 

    while (waitKey(1000/30) != 'q') 
    { 
     video >> frame; 

     vector<Rect> faces; 
     classifier.detectMultiScale(frame, faces); 
     for (int i = 0; i < faces.size(); i++) 
      rectangle(frame, faces[i], Scalar(255, 255, 255)); 

     imshow("Camera", frame); 
    } // <<< The crash occurs here when the faces vector is released 
} 

Я получаю следующее сообщение об ошибке:

Debug Assertion Failed!

Программа: MyProgram.exe Файл: minkernel \ CRTS \ ucrt \ SRC \ appcrt \ куча \ debug_heap.cpp Line: 892

Expression: is_block_type_valid (заголовок -> _ block_use)

+0

Этот код даже работает? вам не нужно 'waitKey (0)' для imshow() для фактического отображения. Кроме того, возможно, это потому, что 'imshow()' использует один из фреймов, который все еще используется. – GPPK

+0

Здесь не должно быть причин использовать «новый» здесь для вектора. – crashmstr

+0

@GPPK: 'waitKey (1000/30)' означает, что он будет ждать ключа, и он попытается запустить 30 кадров в секунду. Все работает отлично, если я удаляю строку 'delete faces;' (за исключением утечки памяти, конечно). – MariusUt

ответ

3

Я имел это тот же выпуск. Я решил это, передав разыменованный глобальный указатель на функцию.

I.e.

std::vector<cv::Rect>* faces = nullptr; 

    void init() 
    { 
     faces = new std::vector<cv::Rect>; //never call delete whatever you do 
    } 

    void findSomeFaces() 
    { 
     cascade->detectMultiScale(image_source, *faces); 
    } 
+0

Не вызывает ли утечка памяти? – user2535650

+0

Я задал этот вопрос, потому что у меня была такая же ситуация, когда я пытаюсь объединить два проекта, которые имеют собственное управление памятью. Когда я пытаюсь удалить выделенную память, он все равно разбился.Поэтому прямо сейчас я вообще не удаляю его, иначе это приведет к сбою моей программы. – user2535650

+0

Правильно, у меня была такая же проблема в моей программе, и именно поэтому я ввел дерзкий комментарий. Теоретически это утечка памяти, но вызов delete на векторе cv :: Rect (опустошен или нет) вызывает проблемы. Необходимо следить за тем, чтобы не постоянно выделять векторы cv :: Rect. Все, что осталось на конце программы, будет очищено ОС. Проблема заключается где-то в коде OpenCV. – Austin

Смежные вопросы