У меня куча коррупции происходит со 100% уверенностью в функции findContours. Когда я его не использую, все работает нормально.OpenCV findContours - 2.4.5 Повреждение кучи
unsigned char* UCFromMatUC(cv::Mat& input)
{
int size = input.size.p[0] * input.size.p[1];
unsigned char* result = new unsigned char[size];
memcpy(result, input.data, size);
return result;
}
unsigned char* CannyEdgeCV(unsigned char* input, int width, int height)
{
std::vector<std::vector<cv::Point> > contours;
std::vector<cv::Vec4i> hierarchy;
cv::RNG rng(12345);
cv::Mat inp(cv::Size(width, height), CV_8UC1, input);
cv::Mat canny_output;
cv::Mat outp;
cv::blur(inp, outp, cv::Size(3,3));
cv::Canny(outp, canny_output, 4.0, 8.0);
if(canny_output.type()!=CV_8UC1){
return NULL;
}
cv::findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0));
cv::Mat drawing = cv::Mat::zeros(canny_output.size(), CV_8UC3);
for(int i = 0; i< contours.size(); i++)
{
cv::Scalar color = cv::Scalar(rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255));
drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, cv::Point());
}
cv::imwrite("contours.jpg", drawing);
unsigned char* result = UCFromMatUC(canny_output);
return result;
}
Первоначально я был только с помощью Осторожных карт краев, но позже я хотел проверить результаты функциональности контура.
Canny Edge отлично работает, и я получаю изображение, как ожидалось, но findContours (как в коде, так и в комментариях) терпят неудачу с ошибкой повреждения кучи. Что вызывает это?
Точка входа для этого является CannyEdgeCV() и вызывается с 640x480 8-битным серым изображением.
Редактировать: обновленный код.
Edit2: когда я попытался создать минимальный пример для воспроизведения этого кода, мой код не удался даже при чтении («imagename.bmp»); который был действительно странным, поэтому я начал исследовать, что может вызвать это. Теперь кто-то написал в соответствующем SO-вопросе, что вы не можете смешивать библиотеки режима отладки/выпуска, поэтому, если вы находитесь в отладке, вам нужно использовать DLL-файлы для отладки, и это сработало для меня сейчас, я получаю ожидаемые результаты.
Err, вы верны в отношении типа возврата. Я изначально имел это в Canny (outp, inp), поэтому inp держал карту края. Но при отладке этого я изменил его на большее количество переменных, вызвав неправильный возврат. Я внедрил ваши предложения, но я все равно получаю ту же самую кучу коррупции. (Обновленный код в редакции) – SinisterMJ
Итак, часть ваших рекомендаций была необходима, чтобы исправить это, но главной проблемой стало то, что я связал библиотеки выпусков с моим отладочным приложением. – SinisterMJ