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

2024-03-29 09:00:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用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(boolean)。

到目前为止,我的解决方案涉及使用返回值的type,如下所示:

if (type(img) is np.ndarray): 
     #do stuff with image

但我想知道:是否有更好的解决方案,更接近初始检查if(img): #do stuff


Tags: 图像imageimportnumpyfalseimgifis
2条回答

如果您确定img的值在您的情况下是None,那么您可以简单地使用if not img is None,或者等效地使用if img is not None。不需要显式检查类型。

注意NoneFalse不是同一个值。但是,bool(None)==False,这就是为什么if None失败的原因。

但是,OpenCV 2和OpenCV 3的imread文档都声明,错误时应返回空矩阵。您可以使用if img.size ==0检查

如果希望在生成图像文件后立即写入内容,则可以使用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)

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

相关问题 更多 >