Ошибка OpenCV imread (filename) в режиме отладки при использовании библиотек выпуска

У меня есть код С++, и все отлично работает с OpenCV, за исключением функции imread(file). Он правильно нашел файл и загрузил имя, но он не загружал никаких данных.

Mat pattImage = imread(fileName, 0);

После некоторого reaserch в Интернете я понял, что я был в режиме отладки, но с версиями OpenCV, а не отладки.

debug library:    opencv_core231d.lib
release library:  opencv_core231.lib

Хотя это типичная глупая ошибка, я думал, что это не должно ничего делать, библиотеки отладки должны разрешать отладку кода OpenCV, в то время как библиотеки релизов позволяют быстрее выполнять код, но Я не понимаю, почему imread не работает.

Может ли кто-нибудь объяснить мне различия между библиотеками отладки и выпуска в OpenCV и почему возникает эта ошибка?

Это ошибка OpenCV?

Ответ 1

Я никогда не устану рассказывать людям, что интерфейс С++ OpenCV для Windows имеет самые жуткие ошибки.

Напишите небольшой тест с использованием интерфейса C, чтобы проверить, работает оно или нет (cvLoadImage() и т.д.).

Обновить: теперь, когда вы знаете, что интерфейс C работает правильно, вы можете либо перейти в список рассылки, либо сообщить об этом ошибке, либо самостоятельно найти код, чтобы узнать, почему он не работает.

Ответ 2

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

Ответ 4

Используйте FORWARD slash (/) вместо обратного слэша(). Даже в Windows!

Неправильно:

cv::imread("C:\example\1.jpg");

Правильно:

cv::imread("C:/example/1.jpg");

Ответ 5

В общем, вполне законно связывать исполняемую конфигурацию "Debug" с библиотекой конфигурации "Release" (почему не должно быть так, чтобы символы, экспортируемые библиотеками, были одинаковыми в Debug и в Release?). Если (по некоторым причинам) вы не хотите, чтобы это "смешивание" происходило. Оказывается, разработчики opencv решили не разрешать такое микширование, и они выполняют такие вероятности с определенной частью кода (то, что вы можете найти в файле cvdef.h в выпуске 3.4.4, строка 54). Это не ошибка интерфейса C++, а "требуемое" поведение. Вы можете найти больше информации на https://github.com/opencv/opencv/pull/9161, где это изменение было задокументировано.

Ответ 6

Вы можете обойти эту проблему, изменив библиотеку времени выполнения вашего приложения отладки с /MDd (многопоточная отладка DLL) на /MD (обычная продакшен версия многопоточной среды выполнения DLL).

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

Чтобы обойти эту проблему, просто перейдите в Свойства> C/C++/Генерация кода и измените "Библиотека времени выполнения" с /MDd на /MD.