首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在OpenCV中使用imread()加载图像时,如何捕获损坏的JPEG?

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

Stack Overflow用户
提问于 2012-02-04 00:30:21
回答 10查看 21.9K关注 0票数 22

OpenCV说类似这样的东西

代码语言:javascript
运行
复制
Corrupt JPEG data: premature end of data segment

或者

代码语言:javascript
运行
复制
Corrupt JPEG data: bad Huffman code

或者

代码语言:javascript
运行
复制
Corrupt JPEG data: 22 extraneous bytes before marker 0xd9

使用imread()加载损坏的jpeg图像时。我能以某种方式捕捉到它吗?为什么我会以其他方式获得此信息?我必须自己检查二进制文件吗?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2012-02-04 01:24:17

如果使用imread()。然而,有imdecode()调用的函数imread()也许

它会给你更多的反馈。为此,您必须自行将图像加载到内存中,然后调用解码器。

归根结底就是:你必须挖掘OpenCV源代码来解决你的问题。

票数 3
EN

Stack Overflow用户

发布于 2014-10-07 22:39:15

OpenCV (2.4版)没有覆盖libjpeg的基本错误处理,使它们“无法捕获”。将以下方法添加到modules/highgui/src/grfmt_jpeg.cpp,恰好在error_exit()

代码语言:javascript
运行
复制
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);
}

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

代码语言:javascript
运行
复制
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 */

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

代码语言:javascript
运行
复制
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错误。示例:

代码语言:javascript
运行
复制
>>> 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 "", line 1, in 
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

(我已经已提交拉取请求但它被拒绝了,因为它会导致人们阅读图像时出现问题,没有例外地捕捉到。)

希望这篇文章能帮助那些仍然在这个问题上苦苦挣扎的人。祝你好运。

票数 11
EN

Stack Overflow用户

发布于 2017-07-12 18:30:22

修复文件中的错误可能比尝试修复OpenCV的加载函数更容易。如果您使用的是Linux,您可以使用ImageMagick对一组镜像进行修复(通常默认安装它):$ mogrify -set comment 'Image rewritten with ImageMagick' *.jpg

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

如果你需要更多关于ImageMagick的信息,你可以访问他们的网站:

http://www.imagemagick.org/script/index.php

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9131992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档