在OpenCV中使用imread()加载图像时如何捕获损坏的JPEG?

Ben*_*Ben 18 jpeg opencv corrupt

OpenCV说的就像

Corrupt JPEG data: premature end of data segment
Run Code Online (Sandbox Code Playgroud)

要么

Corrupt JPEG data: bad Huffman code
Run Code Online (Sandbox Code Playgroud)

要么

Corrupt JPEG data: 22 extraneous bytes before marker 0xd9
Run Code Online (Sandbox Code Playgroud)

使用imread()加载损坏的jpeg图像时.我可以以某种方式抓住它吗?为什么我会收到这些信息?我是否必须自己检查二进制文件?

Rob*_*ert 7

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);
}
Run Code Online (Sandbox Code Playgroud)

现在将该方法应用于解码器错误处理程序:

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 */
Run Code Online (Sandbox Code Playgroud)

将该方法应用于编码器错误处理程序:

cinfo.err = jpeg_std_error(&jerr.pub);
jerr.pub.error_exit = error_exit;
jerr.pub.output_message = output_message; /* Add this line */
Run Code Online (Sandbox Code Playgroud)

像往常一样重新编译和安装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
Run Code Online (Sandbox Code Playgroud)

(我已经提交了上述拉动请求,但它被拒绝了,因为这会导致人们在没有异常捕获的情况下阅读图像时出现问题.)

希望这有助于任何仍在努力解决这个问题的人.祝好运.


goe*_*goe 5

修复文件中的错误可能比尝试修复 OpenCV 的加载功能更容易。如果您使用的是 Linux,则可以使用 ImageMagick 来修复一组图像(通常默认安装它):

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

此命令更改文件的属性,而图像数据保持不变。但是,图像会被加载并重新保存,从而消除导致损坏错误的额外信息。

如果您需要有关 ImageMagick 的更多信息,可以访问他们的网站: http: //www.imagemagick.org/script/index.php


ypn*_*nos 4

如果使用 则无法捕获它imread()。然而,有一个imdecode()被调用的函数imread()也许它会给你更多的反馈。为此,您必须自行将图像加载到内存中,然后调用解码器。

归结为:你必须挖掘 OpenCV 源代码来解决你的问题。

  • 是的..我害怕有人会告诉我这个;) (2认同)