ПОЧЕМУ я решил «Ошибка утверждения отладки OpenCv is_block_type_valid (header-›_block_use)»

Я столкнулся с этим, когда использую findCountours() в OpenCV, Ошибка утверждения отладки У меня есть Google много, но мне ничего не помогло, это часть моих кодов.

void HandTrack::ProcessFrame(...){
    ...
    //Convert the colorImage into grayImage
    Mat GrayImage;
    cvtColor(ColorImages, GrayImage, CV_BGR2GRAY);

    //Convert grayImage into binaryImage
    Mat BinaryImage(GrayImage.rows, GrayImage.cols, CV_8UC1);
    threshold(GrayImage, BinaryImage, 254, 255, CV_THRESH_BINARY);
    bitwise_not(BinaryImage, BinaryImage);

    //Get the contours from binaryImage
    vector<vector<Point>> hand_contours;
    findContours(BinaryImage, hand_contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);
    BinaryImage.release();

    //Draw the contours
    Mat OutlineImage(GrayImage.rows, GrayImage.cols, CV_8UC1);
    rectangle(OutlineImage, Point(0, 0), Point(BinaryImage.cols, BinaryImage.rows), Scalar(255, 255, 255),-1,8);
    if (hand_contours.size() > 0) {
        drawContours(OutlineImage, hand_contours, -1, (0, 0, 0), 1);
    }

    waitkey(1);
}

Ниже я пробовал:

  1. Добавьте наконец imshow("img",BinaryImage);, и ничего не изменится;

  2. Комментируйте эту строку↓, все будет хорошо

    findContours(BinaryImage, hand_contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);

  3. Пройдитесь по кодам, все хорошо, пока «}» ниже

    waitkey(1); }

  4. Добавьте hand_contours.~vector();(функция уничтожения) перед кнопкой ожидания(1); ошибка утверждения отладки показывается везде, где бы она ни находилась;

Наконец, я решил эту проблему, изменив локальную переменную «hand_contours» на глобальную переменную. Но мне все еще интересно, почему это решилось. Спасибо, что прочитали :)

игнорировать, изображения в отладке


person xixi    schedule 19.07.2016    source источник
comment
Проблема в вашей конфигурации. Обязательно сделайте ссылку на отладочные библиотеки OpenCV в режиме отладки и выпустите библиотеки в выпуске. Также обязательно используйте OpenCV, скомпилированный тем же компилятором, что и ваш проект. Теперь вы не решили проблему, она просто скрыта   -  person Miki    schedule 20.07.2016
comment
Привет, Мики. Спасибо за ваш ответ, я уже находил ответы на некоторые вопросы раньше. Я не силен в настройке, но попробую проверить, спасибо.   -  person xixi    schedule 21.07.2016


Ответы (1)


Ваша проблема где-то здесь:

//Convert the colorImage into grayImage
Mat GrayImage;
cvtColor(ColorImages, GrayImage, CV_BGR2GRAY);

//Convert grayImage into binaryImage
Mat BinaryImage(GrayImage.rows, GrayImage.cols, CV_8UC1);
threshold(GrayImage, BinaryImage, 254, 255, CV_THRESH_BINARY);
bitwise_not(BinaryImage, BinaryImage);

//Get the contours from binaryImage
vector<vector<Point>> hand_contours;

Вы создали свой BinaryImage как CV_8UC1, что хорошо, но у меня есть ощущение, что ваш GrayImage не ВСЕГДА будет «... 8-битным одноканальным изображением». в соответствии с требованиями документации. Где-то по пути он, вероятно, не усекается правильно.

Ваш GrayImage был получен из цветного изображения и, вероятно, иногда имеет несколько пустых каналов. Проверьте, чтобы убедиться, что оба dst и src Mat являются правильным форматом (в 99,9% случаев это ошибка утверждения).

Что касается того, как эта проблема была решена из-за изменения глобального? На самом деле невозможно сказать, не видя остальной код. Я полагаю, что каким-то образом это заставило некоторые из ваших функций изменить содержимое вашего MAT в формат, который вы планировали, прежде чем добраться до функции, которую вы показали нам выше. Но на самом деле нет способа сказать, не видя его.

Но мораль этой истории заключается в том, что если вы можете проверить, правильно ли отформатированы ваши src и dst, вы избежите большинства ошибок утверждения.

person Jeremy Gamet    schedule 19.07.2016
comment
Спасибо за ответ! У меня снова есть шаг в отладке, и я уверен, что GrayImage и BinaryImage представляют собой одноканальное изображение (i .stack.imgur.com/tc00Q.png). Код, который я вставляю, связан со всеми кодами, вы можете обнаружить, что GrayImage、BinaryImage являются новыми(); кроме ColorImage(CV_8UC4) из предыдущей части. Я хотел вставить все, но это слишком долго. Спасибо еще раз :) - person xixi; 20.07.2016