OpenCV读取图像时出现“JPEG文件过早结束”的错误。

4

我正在使用OpenCV从文件夹中读取图像。会出现很多这样的消息:

Corrupt JPEG data: premature end of data segment
Premature end of JPEG file
Premature end of JPEG file
Premature end of JPEG file

如何捕获该异常并删除这些图像文件?

而且……呢?展示一些代码。 - Evan Carslake
2个回答

4

如果您说您正在阅读“图像”(多个图像),则需要循环遍历从中读取它们的文件夹中的文件。 在这种情况下,如果您使用以下方法检查图像是否有效或无效:

Mat image;
image = imread(argv[1], CV_LOAD_IMAGE_COLOR);   // Read the file

if(! image.data )                              // Check for invalid input
{
    cout <<  "Could not open or find the image" << std::endl ;
    return -1;
}

您可以继续删除损坏/不良的文件。

2
我也曾苦于找不到解决方案。阅读了许多文章,其中大部分只是说明openCV不会抛出错误,并且只在stderr上输出错误信息。 一些人建议使用PIL,但这不能检测到大多数图像损坏。通常只有文件过早结束。 然而,OpenCV警告的相同错误可以通过imagemagick检测到。
  • 安装imagemagick (https://imagemagick.org/)
  • 确保您已将其添加到路径中。
  • 将以下子程序放入您的代码中,并在需要验证文件的任何位置调用它。 它还将错误输出到stderr,但是它会引发错误(感谢“-regard-warnings”)
import subprocess
def checkFile(imageFile):
    try:
        subprocess.run(["identify", "-regard-warnings", imageFile]).check_returncode()
        return true
    except (subprocess.CalledProcessError) as e:
        return false

如果您不希望检查过程干扰输出,请在运行函数调用时添加stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL参数。

在Windows上,如果您尚未安装传统命令,请使用新语法:

subprocess.run(["magick", "identify", "-regard-warnings", imageFile]).check_returncode()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接