OpenCV imwrite 2.2 вызывает исключение с сообщением «Ошибка OpenCV: неизвестная ошибка (не удалось найти записывающее устройство для указанного расширения)» в Windows 7 - PullRequest
10 голосов
/ 03 августа 2011

Я портирую приложение OpenCV 2.2 из Unix (которое работает) на 64-битную Windows 7, и я получаю следующее исключение, когда cv :: imwrite вызывается

"Ошибка OpenCV: ошибка не указана (можетне удается найти средство записи для указанного расширения) в неизвестной функции, файл highgui \ src \loadave.cpp "

Исходное приложение unix отлично работает на моих компьютерах Mac и Linux.

Кто-нибудь знаеткакую библиотеку или конфигурацию компилятора я мог бы пропустить, чтобы это работало в Windows?

ОБНОВЛЕНИЕ:

Я выполнил следующие действия, чтобы запустить OpenCV:

  • Загрузил двоичные файлы для v2.2 с сайта OpenCV для Windows.Я использую 2.2, потому что его использует оригинальное приложение, и я не хочу усложнять сборку на этом этапе.
  • Я пытаюсь записать в файл .png.Я посмотрел на код OpenCV и заметил необходимость внешних библиотек для кодировщиков, таких как Pngs или jpegs, поэтому я попытался записать в .ppm, .bmp, который, кажется, не требует deps, но я получаю ту же ошибку.
  • Примером моего использования является cv :: imwrite ("out.png", cv_scaled);где cv_scaled имеет тип cv :: Mat с форматом CV_32FC1
  • Пожалуйста, помните, что идентичный код прекрасно работает в Unix

Тот факт, что .bmp или .ppm не работает, это вызывает большевопросы:

  • Почему эти очень простые форматы не работают?
  • Можно ли программно просмотреть список установленных кодировщиков?

Еще раз спасибо за вашу помощь в отладке этой проблемы.

Ответы [ 3 ]

9 голосов
/ 03 августа 2011

Текущая версия OpenCV не поддерживает формат файла, который вы пытаетесь создать на диске.

Проверьте правильность расширения файла.Если это так, вам придется перекомпилировать OpenCV и добавить поддержку этого формата и, возможно, установить недостающие библиотеки.

Это все, что можно сказать без дополнительной информации.

РЕДАКТИРОВАТЬ:

Поскольку мне также не удалось создать приложение, использующее интерфейс C ++ OpenCV (v2.3 на VS2005), я использовал следующий обходной путь: преобразование типов C ++ в типы 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); 
4 голосов
/ 06 ноября 2012

Попробуйте

cvSaveImage("test.jpg", &(IplImage(image)));

вместо

imwrite("test.jpg", image);

Это известная ошибка в используемой вами версии.

0 голосов
/ 17 августа 2012

Из OpenCV 2.2 API :

Функция imwrite сохраняет изображение в указанном файле. Формат изображения выбирается на основе расширения имени файла, список расширений см. В imread. С помощью этой функции можно сохранить только 8-битные (или 16-битные в случае PNG, JPEG 2000 и TIFF) одноканальные или 3-канальные (с порядком канала 'BGR') изображения. Если формат, глубина или порядок каналов отличаются, используйте Mat :: convertTo и cvtColor для преобразования его перед сохранением или используйте универсальные функции ввода-вывода XML для сохранения изображения в формате XML или YAML.

Возможно, вам повезет больше, если вы перед преобразованием сохраните файл в 8 или 16 бит.

Однако даже с одноканальными 8-битными файлами у меня были неизвестные ошибки расширения при попытке сохранить файлы jpg или png, но я обнаружил, что bmp работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...