Я использую 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)
Этот код даже работает? вам не нужно 'waitKey (0)' для imshow() для фактического отображения. Кроме того, возможно, это потому, что 'imshow()' использует один из фреймов, который все еще используется. – GPPK
Здесь не должно быть причин использовать «новый» здесь для вектора. – crashmstr
@GPPK: 'waitKey (1000/30)' означает, что он будет ждать ключа, и он попытается запустить 30 кадров в секунду. Все работает отлично, если я удаляю строку 'delete faces;' (за исключением утечки памяти, конечно). – MariusUt