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 работает.