Сначала я использую OpenCV 2.4.2 с Visual 2008 на WinXp. Вот проблема:
Я использую imwrite
функция для записи серого выровненного изображения, которое имеет следующий прототип:
bool imwrite( const string& filename, InputArray img, const vector<int>& params=vector<int>());
Тип изображения предварительно проверен и установлен (8 бит, 1 канал).
Тем не менее, у меня есть исключение только в режиме Release (ошибка -2, не удалось найти устройство записи для указанного расширения) для записи образа bmp, в моем случае .\Images\Debug\calibration_ref.bmp
,
Я не понял, что не так с этим именем файла.
Посмотрев глубоко в исходный файл dll (opencv_highgui242d.dll ,loadave.cpp, l.298), я понял, что параметр const std::string & filename
(по крайней мере, этот …) был поврежден (или освобожден?) из-за <Bad Ptr>
, Чтобы получить такой результат, я использовал dll-версию отладочной версии highgui в режиме Release, иначе, при выпуске версии highgui, вместо этого я получаю строку мусора. Я подозреваю, что все аргументы были искажены.
Я абсолютно не знаю, откуда взялась эта коррупция! Я искал здесь и там, но все, что я мог найти, связано с отключением оптимизации в режиме релиза, затем исправлением ошибок и Эта статья на строковом классе о потоке безопасно, но я не уверен, что это проблема.
Я бы добавил, что используемая мной версия OpenCV не является пакетом. Я построил это особенно с TBB (версия 4.0 6005). Не стесняйтесь задавать больше вопросов.
Вы просматриваете сборку релиза, поэтому отладчик не сможет отобразить все значения, поскольку оптимизация удалит некоторые объекты. Я думаю, что вы спустились в кроличью нору с «коррупцией».
Вы говорите, что ошибка error -2, could not find a writer for the specified extension
так вы смотрели, чтобы узнать, почему это? Какой модуль записи используется в режиме отладки, а почему нет — в режиме выпуска. Это может быть просто отсутствующая DLL в вашем рабочем каталоге.
Я также рекомендую изменить имя выходного файла, чтобы не путать вывод с каждой сборки. .\Images\Debug\calibration_ref.bmp
может быть лучше, как .\Images\Release\calibration_ref.bmp
, например.
Проблема связана со статическим порядком инициализации.
Поскольку имя файла объявлено как статическое, что зависит от других статических параметров (у меня много статических переменных в этом проекте), я получил неинициализированную переменную в качестве параметра. Это причина, почему он поднял исключение с плохим аргументом.
Я мог отследить это явление благодаря точкам останова при инициализации переменной и выполнении функции. Казнь произошла первой …
Тем не менее, было бы неплохо сделать трассировку параметра (скорее OutputDebugString
или что-то для принудительного отображения, так как трассировка не будет работать в режиме разблокировки) до входа в функцию.