OpenCV (phiên bản 2.4) không ghi đè lên xử lý lỗi cơ bản cho libjpeg, khiến chúng không thể xử lý được '. Thêm phương pháp sau đây để modules/highgui/src/grfmt_jpeg.cpp
, ngay bên dưới các định nghĩa của 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);
}
Bây giờ áp dụng phương pháp này để xử lý lỗi giải mã:
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 */
Áp dụng các phương pháp để xử lý lỗi encoder cũng như:
cinfo.err = jpeg_std_error(&jerr.pub);
jerr.pub.error_exit = error_exit;
jerr.pub.output_message = output_message; /* Add this line */
Biên dịch lại và cài đặt OpenCV như bình thường. Từ bây giờ bạn sẽ có thể bắt lỗi libjpeg giống như bất kỳ lỗi OpenCV nào khác. Ví dụ:
>>> 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
(Tôi đã submitted a pull request cho ở trên nhưng nó đã bị từ chối vì nó sẽ gây ra vấn đề với những người đọc hình ảnh không có ngoại lệ đánh bắt.)
Hy vọng điều này sẽ giúp mọi người vẫn phải vật lộn với vấn đề này. Chúc may mắn.
Xin chào, bạn có giải pháp cho vấn đề này không, tôi cũng chống lại vấn đề này với OpenCV. Cảm ơn bạn! –
người dùng cũng có thể quan tâm đến việc đọc [bài đăng tại đây] (https://stackoverflow.com/questions/24805500/can-i-fix-photos-with-corrupt-jpeg-data) – jdhao