#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 (с дополнительными модулями) программа выполняется без каких-либо исключений.