2011-08-03 22 views
10

Estoy portando una aplicación OpenCV 2.2 desde Unix (que funciona) en Windows 7 64- bit y recibo la siguiente excepción al cv :: imwrite se llamaOpenCV imwrite 2.2 causa una excepción con el mensaje "OpenCV Error: error no especificado (no se pudo encontrar un escritor para la extensión especificada)" en Windows 7

"OpenCV de error: error no especificado (no podía encontrar un escritor para la extensión especificada) en función desconocida, archivo highgui \ src \ loadsave.cpp"

La aplicación original de Unix funciona bien en mis cajas Mac y Linux.

¿Alguien sabe qué configuración de biblioteca o compilador podría faltar que hace que esto funcione en Windows?

ACTUALIZACIÓN:

hice las siguientes cosas para conseguir OpenCV en marcha:

  • descargado los archivos binarios para v2.2 desde el sitio OpenCV para las ventanas. Estoy usando 2.2 porque la aplicación original lo usa y no quiero complicar mi compilación en esta etapa.
  • Estoy intentando imprimir a un archivo .png. Miré el código de OpenCV y noté la necesidad de libs externos para Encoders como Pngs o jpegs, así que intenté escribir en .ppm, .bmp que parece no requerir deps, pero obtengo el mismo error.
  • Un ejemplo de mi uso es cv :: imwrite ("out.png", cv_scaled); donde cv_scaled es de tipo cv :: Mat con formato CV_32FC1
  • Por favor, recuerde el código idéntico funciona bien en Unix

El hecho .bmp o .ppm no funciona esto plantea más preguntas:

  • ¿Por qué no funcionan estos formatos muy simples?
  • ¿Hay alguna manera de ver una lista de Encoders instalados programáticamente?

Gracias de nuevo por su amable ayuda para ayudarme a solucionar este problema.

+0

+1 También está sucediendo con 'imread()' de OpenCV 2.3 en VS 2005 en mi WinXP box. – karlphillip

+0

Tuve el mismo problema, y ​​estaba usando librerías de lanzamiento de OpenCV mientras desarrollaba la depuración. Cambié las bibliotecas para depurar bibliotecas y el problema fue resuelto. En caso de que alguien cometiera el mismo tipo de error que yo. – MeM

Respuesta

9

Su instalación actual de OpenCV no admite el formato de archivo que está intentando crear en el disco.

Compruebe si la extensión del archivo es correcta. Si es así, tendrás que recompilar OpenCV y agregar soporte a este formato y posiblemente instalar las bibliotecas que te faltan.

Eso es todo lo que se puede decir sin más información.

EDIT:

Como también he podido construir una aplicación que utiliza la interfaz de C++ de OpenCV (v2.3 en VS2005) Terminé usando la siguiente solución: convertir el C++ tipos a los tipos C cuando sea necesario.

convertir de IplImage* a cv::Mat es bastante sencillo:

IplImage* ipl_img = cvLoadImage("test.jpg", CV_LOAD_IMAGE_UNCHANGED); 
Mat mat_img(ipl_img); 

imshow("window", mat_img); 

La conversión cv::Mat a IplImage* no es tan obvio, pero también es simple, y el truco es usar un IplImage en lugar de un 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); 
+0

Gracias @karlphillip - He actualizado la pregunta para incluir más detalles sobre mi uso – CVertex

+0

Ni siquiera puedo obtener 'imread()' para cargar un JPG en WinXP con OpenCV 2.3. LOL. Tengo que resolver eso antes de llegar a 'imwrite()'. Háganos saber sus hallazgos. – karlphillip

+0

¿A qué bibliotecas (libs/dlls) hace referencia su aplicación? – CVertex

0

Desde el OpenCV 2.2 API:

The function imwrite saves the image to the specified file. The image format is chosen based on the filename extension, see imread for the list of extensions. Only 8-bit (or 16-bit in the case of PNG, JPEG 2000 and TIFF) single-channel or 3-channel (with ‘BGR’ channel order) images can be saved using this function. If the format, depth or channel order is different, use Mat::convertTo , and cvtColor to convert it before saving, or use the universal XML I/O functions to save the image to XML or YAML format.

Es posible que tenga más suerte al convertir su archivo a 8 o 16 bits antes de guardar.

Sin embargo, incluso con archivos de 8 bits de un solo canal, he tenido errores de extensión desconocidos tratando de guardar archivos jpg o png, pero he encontrado que bmp funciona.

4

Trate

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

en lugar de

imwrite("test.jpg", image); 

Ésta es a known bug en la versión que está utilizando.

Cuestiones relacionadas