Si encuentras alguna incompatibilidad en tu código o proyecto, recuerda probar siempre en un entorno de testing antes añadir el código al proyecto final.
Solución:
OpenCV (versión 2.4) no sobrescribe el manejo básico de errores para libjpeg, haciéndolos ‘imposibles de capturar’. Agregue el siguiente método a modules/highgui/src/grfmt_jpeg.cpp
justo debajo de la definición de error_exit()
:
METHODDEF(void)
output_message( j_common_ptr cinfo )
char buffer[JMSG_LENGTH_MAX];
/* Create the message */
(*cinfo->err->format_message) (cinfo, buffer);
/* Default OpenCV error handling instead of print */
CV_Error(CV_StsError, buffer);
Ahora aplique el método al controlador de errores del decodificador:
state->cinfo.err = jpeg_std_error(&state->jerr.pub);
state->jerr.pub.error_exit = error_exit;
state->jerr.pub.output_message = output_message; /* Add this line */
Aplique el método al controlador de errores del codificador también:
cinfo.err = jpeg_std_error(&jerr.pub);
jerr.pub.error_exit = error_exit;
jerr.pub.output_message = output_message; /* Add this line */
Vuelva a compilar e instale OpenCV como de costumbre. A partir de ahora, debería poder detectar errores de libjpeg como cualquier otro error de OpenCV. Ejemplo:
>>> cv2.imread("/var/opencv/bad_image.jpg")
OpenCV Error: Unspecified error (Corrupt JPEG data: 1137 extraneous bytes before marker 0xc4) in output_message, file /var/opencv/opencv-2.4.9/modules/highgui/src/grfmt_jpeg.cpp, line 180
Traceback (most recent call last):
File "", line 1, in
cv2.error: /var/opencv/opencv-2.4.9/modules/highgui/src/grfmt_jpeg.cpp:180: error: (-2) Corrupt JPEG data: 1137 extraneous bytes before marker 0xc4 in function output_message
(Envié una solicitud de extracción para lo anterior, pero fue rechazada porque causaría problemas con las personas que leen las imágenes sin que se detecten excepciones).
Espero que esto ayude a cualquiera que todavía esté luchando con este problema. Buena suerte.
No puedes atraparlo si usas imread()
. Sin embargo, hay imdecode()
función que es llamada por imread()
. Quizás te da más retroalimentación. Para esto, tendría que cargar la imagen en la memoria por su cuenta y luego llamar al decodificador.
Se reduce a: tiene que buscar en las fuentes de OpenCV para resolver su problema.
Podría ser más fácil corregir el error en el archivo en lugar de intentar reparar la función de carga de OpenCV. Si está utilizando Linux, puede usar ImageMagick para reparar un conjunto de imágenes (lo habitual es tenerlo instalado por defecto):
$ mogrify -set comment 'Image rewritten with ImageMagick' *.jpg
Este comando cambia una propiedad del archivo dejando intactos los datos de la imagen. Sin embargo, la imagen se carga y se vuelve a guardar, eliminando la información adicional que provoca el error de corrupción.
Si necesita más información sobre ImageMagick, puede visitar su sitio web: http://www.imagemagick.org/script/index.php
Aquí puedes ver las comentarios y valoraciones de los usuarios
Nos encantaría que puedieras dar difusión a este enunciado si te fue útil.