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

时间:2014-05-13 10:07:16

标签: python opencv numpy

我正在用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

3 个答案:

答案 0 :(得分:33)

如果您确定img的值为None,则可以使用if not img is None,或等效地if img is not None。您无需明确检查类型。

请注意,NoneFalse 不是相同的值。但是,bool(None)==False,这就是if None失败的原因。

OpenCV 2和3的imread文档指出,错误时应返回空矩阵。您可以使用if img.size ==0

进行检查

答案 1 :(得分:4)

如果要在生成映像文件后立即编写内容,则可以使用os.path.isfile(),它会返回bool值,具体取决于给定目录中是否存在文件。 / p>

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)

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

答案 2 :(得分:1)

根据文档,我们可能会使用

retval  =   cv.haveImageReader (filename)

来源https://docs.opencv.org/master/d4/da8/group__imgcodecs.html