OpenCV (wersja 2.4) nie zastępuje podstawowej obsługi błędów dla libjpeg, co powoduje, że są one "nierozłączne". Dodaj następującą metodę do modules/highgui/src/grfmt_jpeg.cpp
, tuż poniżej definicji 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);
}
Teraz zastosowania metody do obsługi błędów dekodera:
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 */
zastosować metodę do obsługi błędów enkodera, a także:
cinfo.err = jpeg_std_error(&jerr.pub);
jerr.pub.error_exit = error_exit;
jerr.pub.output_message = output_message; /* Add this line */
Ponownie skompiluj i zainstaluj OpenCV jak zwykle. Od tej pory powinieneś być w stanie złapać błędy libjpeg jak każdy inny błąd OpenCV. Przykład:
>>> 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
(mam submitted a pull request do powyższego, ale został odrzucony, ponieważ spowodowałoby to problemy z osobami czytania obrazów bez wyjątku wzrok.)
Nadzieja to pomaga ktoś nadal zmaga się z tym problemem. Powodzenia.
Witam, mam rozwiązanie tego problemu, ja też mam ten problem z OpenCV. Dziękuję Ci! –
użytkowników może być także zainteresowany przeczytaniem [post tutaj] (https://stackoverflow.com/questions/24805500/can-i-fix-photos-with-corrupt-jpeg-data) – jdhao