opencv读取图像“;JPEG文件过早结束”;

opencv读取图像“;JPEG文件过早结束”;,opencv,Opencv,我使用OpenCV从文件夹中读取图像。出现了很多这样的信息: Corrupt JPEG data: premature end of data segment Premature end of JPEG file Premature end of JPEG file Premature end of JPEG file 如何捕获此异常并删除这些图像文件?既然您说您正在读取“图像”(多个图像),那么您将在从中读取图像的文件夹中循环文件。 在这种情况下,如果使用以下命令检查图像是否有效: Mat

我使用OpenCV从文件夹中读取图像。出现了很多这样的信息:

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

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

既然您说您正在读取“图像”(多个图像),那么您将在从中读取图像的文件夹中循环文件。 在这种情况下,如果使用以下命令检查图像是否有效:

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;
}
Mat图像;
image=imread(argv[1],CV_LOAD_image_COLOR);//读文件
if(!image.data)//检查输入是否无效
{

cout我也一直在努力寻找解决方案。读了几十篇文章,其中大部分都说openCV不会抛出错误,只在stderr上输出错误。 有人建议使用PIL,但这并不能检测到大部分的图像损坏,通常只是文件的过早结束

但是,OpenCV警告的错误可以通过imagemagick检测到

  • 安装imagemagick()
  • 确保它在路径中
  • 将下面的子代码放入代码中,并调用它来验证任何需要验证的文件。它也会将错误输出到stderr,但会引发错误(感谢“-atterk warnings”)
导入子流程
def检查文件(图像文件):
尝试:
subprocess.run([“标识”,“注意警告”,imageFile])。检查返回代码()
返回真值
除了(子流程调用的流程错误)外,其他为e:
返回错误
如果不希望该检查对输出进行垃圾邮件处理,请将stdout=subprocess.DEVNULL、stderr=subprocess.DEVNULL
params添加到run函数调用中

在windows上,如果尚未安装旧命令,请使用新语法:

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

和………?显示一些代码。