2012-02-03 24 views
10

OpenCV dice algo así como¿Cómo puedo capturar JPEG corruptos al cargar una imagen con imread() en OpenCV?

Corrupt JPEG data: premature end of data segment 

o

Corrupt JPEG data: bad Huffman code 

o

Corrupt JPEG data: 22 extraneous bytes before marker 0xd9 

al cargar una imagen jpeg corrupto con imread(). ¿De alguna manera puedo captar eso? ¿Por qué obtendría esta información de otra manera? ¿Debo verificar el archivo binario por mi cuenta?

+0

Hola, tienes una solución para este problema, también estoy contra este problema con OpenCV. ¡Gracias! –

+0

los usuarios también pueden estar interesados ​​en leer el [publicar aquí] (https://stackoverflow.com/questions/24805500/can-fix-photos-with-corrupt-jpeg-data) – jdhao

Respuesta

1

No puede atraparlo si usa imread(). Sin embargo, existe la función imdecode() que se llama por imread(). Tal vez le da más comentarios. Para esto, tendrá que cargar la imagen en la memoria por su cuenta y luego llamar al decodificador.

Se reduce a: debe buscar entre las fuentes de OpenCV para resolver su problema.

+1

sí ... tenía miedo de que alguien me diría esto;) – Ben

+0

¿Alguna vez encontraste la manera de hacer esto ?, estaría muy interesado ya que estoy enfrentando el mismo problema. – joon

+1

imdecode() no da ningún comentario acerca de las advertencias de libjpeg – Aubin

1

tuve que lidiar con esto recientemente y se encontró una solución aquí

http://artax.karlin.mff.cuni.cz/~isa_j1am/other/opencv/

i sólo tiene que hacer 2 ediciones @ $ cv \ modules \ highgui \ src \ grfmt_jpeg.cpp.

--- opencv-1.0.0.orig/otherlibs/highgui/grfmt_jpeg.cpp 2006-10-16 13:02:49.000000000 +0200 
+++ opencv-1.0.0/otherlibs/highgui/grfmt_jpeg.cpp 2007-08-11 09:10:28.000000000 +0200 
@@ -181,7 +181,7 @@ 
      m_height = cinfo->image_height; 
      m_iscolor = cinfo->num_components > 1; 

-   result = true; 
+   result = (cinfo->err->num_warnings == 0); 
     } 
    } 

@@ -405,8 +405,9 @@ 
         icvCvt_CMYK2Gray_8u_C4C1R(buffer[0], 0, data, 0, cvSize(m_width,1)); 
       } 
      } 
-   result = true; 
+ 
      jpeg_finish_decompress(cinfo); 
+   result = (cinfo->err->num_warnings == 0); 
     } 
    } 
4

OpenCV (versión 2.4) no sobrescribe el manejo básico de errores para libjpeg, lo que los hace 'inaptos'. Agregue el siguiente método para modules/highgui/src/grfmt_jpeg.cpp, justo por 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 aplicar el método para el tratamiento de errores 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 */ 

Aplicar el método para el tratamiento de errores codificador así:

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, podrá 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 "<stdin>", line 1, in <module> 
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 

(he submitted a pull request de lo anterior, pero fue rechazado porque causaría problemas con la gente que lee imágenes sin excepción captura.)

la esperanza que esto ayude a que aún lucha con este problema. Buena suerte.

0

Puede redirigir stderr a un archivo, luego después de imread, busque la cadena "Huffman" dentro de ese archivo. Después de buscar el archivo, vacíelo. Funciona para mí y ahora puedo descartar imágenes corruptas y solo procesar las buenas.

0

Descubrí que el problema está en libjpeg.Si OpenCV lo utiliza, se pone de error

datos corruptos JPEG: 22 bytes extrañas antes del MP 0xd9

Usted puede intentar my solution para resolverlo. Deshabilita JPEG durante la compilación. Después de eso, OpenCV no puede leer/escribir, pero funciona.

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_SHARED_LIBS=OFF -D BUILD_EXAMPLES=OFF -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D WITH_JPEG=OFF -D WITH_IPP=OFF .. 
+0

Debe publicar su solución aquí, sin señalar al usuario a otro lugar. Los enlaces se utilizan para proporcionar más información. – jdhao

1

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 a un conjunto de imágenes (es habitual a tenerlo instalado por defecto):

$ mogrify -set comment 'Image rewritten with ImageMagick' *.jpg

Este comando cambia una propiedad del archivo dejando los datos de imagen sin tocar . Sin embargo, la imagen se carga y vuelve a guardar, eliminando la información adicional que causa el error de corrupción.

Si necesita más información acerca de ImageMagick puede visitar su página web: http://www.imagemagick.org/script/index.php

+0

Aunque es difícil detectar el error, al menos podemos eliminar el mensaje de error de esta manera. Es una buena solución ~ – jdhao

0

estoy usando OpenCV paquete python para leer algunos de imagen y también se reunió este mensaje de error. Este error no puede ser capturado por Python. Pero si desea encontrar qué imagen está dañada sin volver a compilar OpenCV como sugirió @Robbert, puede probar el siguiente método.

Primero, puede identificar el directorio donde residen las imágenes corruptas, lo cual es bastante fácil. Luego vaya al directorio y use la herramienta de línea de comandos mogrify proporcionada por ImageMagick para cambiar la metainformación de la imagen, tal como sugiere @goe.

mogrify -set comment "errors fixed in meta info" -format png *.jpg 

El comando anterior convertir la imagen jpg original al formato png y también limpiar la imagen original para eliminar errores en la información de metadatos. Cuando ejecuta el comando mogrify, también mostrará un mensaje sobre qué imagen está dañada en el directorio para que pueda encontrar con precisión la imagen dañada.

Después de eso, puede hacer lo que quiera con la imagen original jpg corrupta.

Cuestiones relacionadas