OpenCV(2.4 版)不会覆盖 libjpeg 的基本错误处理,使它们“无法捕获”。将以下方法添加到modules/highgui/src/grfmt_jpeg.cpp,就在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);
}
现在将该方法应用于解码器错误处理程序:
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 */
将该方法也应用于编码器错误处理程序:
cinfo.err = jpeg_std_error(&jerr.pub);
jerr.pub.error_exit = error_exit;
jerr.pub.output_message = output_message; /* Add this line */
像往常一样重新编译和安装 OpenCV。从现在开始,您应该能够像任何其他 OpenCV 错误一样捕获 libjpeg 错误。示例:
>>> 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
(我上面有submitted a pull request,但它被拒绝了,因为它会导致人们阅读图像时出现问题,而不会异常捕捉。)
希望这可以帮助仍在努力解决此问题的任何人。祝你好运。