cv2.imread:检查图像是否被读取

28

我正在使用Python编写OpenCV程序,在某个时刻我有一个类似于以下的代码:

import cv2
import numpy as np
... 
img = cv2.imread("myImage.jpg")

# do stuff with image here 

问题在于我必须在继续之前检测图像文件是否被正确读取。如果无法打开图像,cv2.imread将返回False,因此我考虑做这样一些事情:
if (img):
   #continue doing stuff

发生的情况是,如果图像未打开(例如文件不存在),img 就等于 None (正如预期的那样)。然而,当 imread 能够工作时,条件就会被打破:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

即所返回的 numpy.ndarray 不能用作布尔值。问题似乎在于,imread 在成功时返回 numpy.ndarray,否则返回 False(布尔值)。
到目前为止,我的解决方案涉及使用返回值的 type,如下所示:
if (type(img) is np.ndarray): 
     #do stuff with image

但我在想:有没有更好的解决方案,更接近于最初的检查 if(img): #do stuff

4个回答

62
如果您确定在您的情况下 img 的值为 None,您可以简单地使用 if not img is None 或者等价的 if img is not None。您不需要显式地检查类型。
请注意,NoneFalse 不是相同的值。但是,bool(None)==False,这就是为什么 if None 失败的原因。
然而,imread 的文档,无论是 OpenCV 2 还是 3,都指出如果发生错误应该返回一个空矩阵。您可以使用 if img.size ==0 来检查它。

你知道使用imread尝试读取不存在的图像是否会抛出cv2.error或类似的错误吗? - waspinator
5
文档中说明:如果图像不能被读取(由于缺少文件、权限不正确、格式不受支持或无效),该函数将返回一个空矩阵。 - loopbackbee
6
由于将“None”与矩阵进行比较而引发了异常:“ValueError:数组中有多个元素的真值不明确。请使用a.any()或a.all()”。对我来说,@ZdaR的回答中使用“isfile(“myImage.jpg”)”进行检查是更好的选择。 - Eduardo Pignatelli
有没有证据证明img.size == 0是正确的?我能找到的(和观察到的)只是在OpenCV >= 3上imread()返回None - undefined

8

如果您希望在图像文件生成后立即编写内容,则可以使用os.path.isfile(),它会根据给定目录中是否存在文件返回一个bool值。

import cv2 
import os.path

while not os.path.isfile("myImage.jpg"):
    #ignore if no such file is present.
    pass

img = cv2.imread("myImage.jpg", 0)

cv2.imwrite("result.jpg", img)

您还可以参考文档,了解每种方法的详细实现和基本图像操作。


4

如何检查“多张图片”的数量?例如,我有两个类别,即A和B,其中A包含500张图片,B包含502张图片。在这种情况下,如何检查“空白图片”?@Zdar - user13428955

0
这会捕捉到在打开文件操作时的任何错误。
try:
    img = cv2.imread("myImage.jpg")
except:
      print("error message")
      exit()

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