OpenCV imwrite 2.2 вызывает исключение с сообщением "Ошибка OpenCV: ошибка Unspecified (не удалось найти запись для указанного расширения)" в Windows 7
Я переношу приложение OpenCV 2.2 из Unix (который работает) на 64-разрядную версию Windows 7, и я получаю следующее исключение, когда cv:: imwrite вызывается
"Ошибка OpenCV: ошибка Unspecified (не удалось найти запись для указанного расширения) в неизвестной функции, файл highgui\src\loadedave.cpp"
Исходное приложение unix отлично работает на моих Mac и Linux.
Кто-нибудь знает, какую библиотеку или конфигурацию компилятора я могу пропустить, что делает эту работу в Windows?
UPDATE:
Для запуска OpenCV я выполнил следующие действия:
- Загрузили двоичные файлы для v2.2 с сайта OpenCV для окон. Я использую 2.2, потому что исходное приложение использует его, и я не хочу усложнять мою сборку на этом этапе.
- Я пытаюсь импортировать файл .png. Я посмотрел на код OpenCV и заметил необходимость внешних библиотек для кодеров, таких как Pngs или jpegs, поэтому я попробовал записать в .ppm,.bmp, который, похоже, не требует отпечатков, но я получаю идентичную ошибку.
- Примером моего использования является cv:: imwrite ( "out.png", cv_scaled); где cv_scaled имеет тип cv:: Mat с форматом CV_32FC1
- Помните, что идентичный код отлично работает в unix
Факт .bmp или .ppm не работает, возникает больше вопросов:
- Почему эти простые форматы не работают?
- Есть ли способ программно просмотреть список установленных кодеров?
Еще раз спасибо за вашу любезную помощь в том, чтобы помочь мне отладить эту проблему.
Ответы
Ответ 1
Ваша текущая установка OpenCV не поддерживает формат файла, который вы пытаетесь создать на диске.
Проверьте правильность расширения файла. Если это так, вам придется перекомпилировать OpenCV и добавить поддержку этого формата и, возможно, установить библиотеки, которые вам не хватает.
Это все, что можно сказать без дополнительной информации.
EDIT:
Как я также не смог создать приложение, которое использует интерфейс С++ для OpenCV (v2.3 на VS2005), я закончил использование следующего обходного пути: при необходимости преобразуйте типы С++ в типы C.
Преобразование из IplImage*
в cv::Mat
довольно прямолинейно:
IplImage* ipl_img = cvLoadImage("test.jpg", CV_LOAD_IMAGE_UNCHANGED);
Mat mat_img(ipl_img);
imshow("window", mat_img);
Преобразование cv::Mat
в IplImage*
не так очевидно, но оно также простое, и трюк заключается в использовании IplImage
вместо IplImage*
:
IplImage ipl_from_mat((IplImage)mat_img);
cvNamedWindow("window", CV_WINDOW_AUTOSIZE);
// and then pass the memory address of the variable when you need it as IplImage*
cvShowImage("window", &ipl_from_mat);
Ответ 2
Попробуйте
cvSaveImage("test.jpg", &(IplImage(image)));
вместо
imwrite("test.jpg", image);
Это известная ошибка в используемой вами версии.
Ответ 3
Из API OpenCV 2.2:
Функция imwrite сохраняет изображение в указанном файле. Формат изображения выбирается на основе расширения имени файла, см. Imread для списка расширений. Только 8-битные (или 16-битные в случае PNG, JPEG 2000 и TIFF) одноканальные или 3-канальные (с порядком канала BGR) могут быть сохранены с помощью этой функции. Если формат, глубина или порядок каналов различны, используйте Mat:: convertTo и cvtColor для его преобразования перед сохранением или используйте универсальные функции ввода/вывода XML для сохранения изображения в формате XML или YAML.
Возможно, вам удастся преобразовать файл в 8 или 16 бит перед сохранением.
Однако даже с одноканальными 8-битными файлами у меня были неизвестные ошибки расширения, пытающиеся сохранить jpg или png файлы, но обнаружили, что bmp работает.