Corrupt JPEG data: 36 extraneous bytes before marker 0xd9,opencv获取imread报错方法

错误类型:Corrupt JPEG data: 36 extraneous bytes before marker 0xd9
原因:opencv imread默认有错误直接跳过,不会返回,需要修改源码才能使之报错
 
① 修改 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);
}

 

 
②在 decoder error handler 添加以上函数的实现:
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 */

 

③ 在 encoder error handler 添加以上函数的实现:
cinfo.err = jpeg_std_error(&jerr.pub);
jerr.pub.error_exit = error_exit;
jerr.pub.output_message = output_message; /* Add this line */

 

④ 修改完后重新编译opencv,在imread错误的jpg文件后会报错了:
>>> 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

 

这时,opencv写imread的代码 一定要用 try catch语法:
try{
im = imread( " XXX.jpg" );
}
catch(char *str){
xxx
}

 

PS: 如果linux系统重新装了eigen3,那么编译opencv会报错:
[..]/modules /contrib /src /rgbdodometry .cpp : 65 : 47 : fatal error : unsupported / Eigen / MatrixFunctions : No such file or directory
 
解决方法如下:
修改modules/contrib/src/rgbdodometry.cpp代码:
#include<unsupported / Eigen / MatrixFunctions> 修改为 #include</usr/local/include/eigen3/unsupported/Eigen/MatrixFunctions>
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值