ucrtbase.dll : Недопустимый параметр был передан функции, которая считает недопустимые параметры фатальными

#windows #opencv #visual-studio-2015 #sift #keypoint

#Windows #opencv #visual-studio-2015 #просеять #ключевая точка

Вопрос:

В настоящее время я работаю над личным проектом с OpenCV, и у меня есть несколько проблем во время выполнения программы. После внедрения распознавателя AKAZE BOW (который, похоже, недостаточно хорошо работал для моей проблемы) Я хотел попробовать реализацию SIFT (и, в конечном итоге, SURF).

Для моего проекта я следую этому, найденному на github, и я использую VS2015 (сообщество) и OpenCV 2.4.13 поверх Windows 10.

Проблема, с которой я сталкиваюсь, как указано в названии, связана с ucrtbase.dll который получает недопустимый параметр во время выполнения (если я правильно прочитал другие потоки, dll должна быть библиотекой ОС в Windows 10). Проблема возникает, когда конструктор переходит на вторую итерацию (иначе говоря, когда он должен получить функции другого изображения для обучения BOW), это когда выполнение останавливается и появляется ошибка в заголовке.

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

Функция drawKeypoints (используемая в другом тесте), похоже, правильно рисует ключевые точки (что должно означать, что функция обнаружения работает правильно).

Ниже вы можете найти фрагмент, который выдает ошибку:

 int main(int argc, char ** argv)
{

    const int nimages = 4;
    const int nclusters = 2;

    const char *datapath = "./database";

    SiftFeatureDetector detector(400);
    SiftDescriptorExtractor extractor;
    Ptr<BOWTrainer> bow_train = makePtr<BOWKMeansTrainer>(nclusters);

    for (int i = 0; i<nimages; i  )
    {

        Mat im, feat;
        std::vector<KeyPoint> kp;

        // read an image from the database
        im = cv::imread(format("%s/%d.png", datapath, i   1), 1);

        // detect keypoints
        detector.detect(im, kp); // commenting from here avoids the error

        // extract features
        extractor.compute(im, kp, feat);

        // add features for bow training
        bow_train->add(feat);

    }

    /* more stuff here */
}
 

Скажите мне, есть ли что-нибудь еще, что вам нужно знать, чтобы понять проблему.

Заранее спасибо за любую помощь / совет, который вы можете мне дать.

РЕДАКТИРОВАТЬ 1:

Я попытался удалить все для cicles, и программе удается достичь конца, выполняя все функции правильно, но она по-прежнему выдает ucrtbase.dll ошибка при возврате из main. Еще одна вещь, которую я заметил во время отладки VS, заключается в том, что отладчик генерирует исключение, когда ему нужно освободить память (используя эту dll), либо во время циклов, либо в конце программы.

Я предполагаю, что у отладчика здесь есть решение, но я действительно не понимаю, в чем проблема с этой dll, любая помощь будет очень признательна, если у кого-нибудь есть свободное время.

РЕДАКТИРОВАТЬ 2:

После нескольких дней тестирования кажется, что ошибка возникает из-за освобождения:

std::vector< cv::KeyPoint >

Если векторы ключевых точек создаются и уничтожаются только при завершении программы, вычисление работает нормально, и в конце появляется ошибка dll (что раздражает, но для быстрых тестов я могу справиться).

Проблема в том, что я хотел бы создавать функции, которые используют эти векторы, без необходимости передавать их в качестве аргументов. Поскольку освобождение, по-видимому, является проблемой, я не могу этого сделать без сбоя программы после каждого вызова указанных функций. Я также пытался использовать clear() и swap() для вектора, но это тоже не сработало.

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

Ответ №1:

Эта проблема с сбоем при освобождении вектора, по-видимому, связана со связыванием с неправильной версией библиотеки OpenCV. Если вы создаете в Debug, вам нужно быть связанным с opencv_world320d.lib (или opencv_world310.lib или библиотекой для любой версии OpenCV, которую вы используете) — «d» после номера версии имеет значение. Для конфигураций выпуска используйте opencv_worldXXX.lib для ссылки.

Если вы видите сообщение «недопустимый параметр был передан функции, которая учитывает …», это признак той же проблемы.

Ответ №2:

Через некоторое время, я думаю, я понял это.

Похоже, проблема была с компилятором VS2015: в OpenCV 2.4.13 есть некоторые проблемы с этой версией VS, и это, вероятно, потому, что вместо vc14 есть только папка vc12, которая должна работать с VS2015 (в основном совместимость не гарантируется полностью).

После перехода к сборке OpenCV3.1 (с дополнительными модулями) программа выполняется без каких-либо исключений.