使用image == None时的ValueError

Naz*_*han 0 python opencv numpy


我正在为我的程序创建一个故障保护,所以每当图像不存在或者image = None它将显示一条消息并终止程序时.我使用下面的代码作为一种方法来执行此操作:

src_img = cv2.imread('/home/nazar/Downloads/img_4.png', 1)
if src_img == None:
    exit('No such file or direcory!')
copy = src_img.copy()
Run Code Online (Sandbox Code Playgroud)

如果没有图像,但是当有图像时,它会产生错误:

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

我尝试按照错误的建议尝试if src_img.all == None:,现在当没有图像时,它会给出错误:

AttributeError: 'NoneType' object has no attribute 'all'
Run Code Online (Sandbox Code Playgroud)

有没有办法在不获取这些错误消息的情况下实际执行此操作,并且如果给出图像或者没有给出图像,则可以正常工作.

Mad*_*ist 5

你得到第一个ValueError因为NoneType没有定义与numpy数组的相等比较,所以使用数组的比较方法.Numpy将None转换为对象数组并将其广播为图像的大小.结果==是元素比较,即与图像大小相同的布尔数组.

而不是所有这些,你应该这样做

if src_img is None:
Run Code Online (Sandbox Code Playgroud)

is比较原始参考.这是检查None的推荐方法,因为它更快,None是单例.

第二个AttributeError来自以下事实:当src_img为None时,它没有名为的方法all.即使它是一个正确的数组,src_img.all也只是对该方法的引用,而不是调用它的结果.

奇怪的是,你可以完全放弃做if np.all(src_img == None):,但你真的不应该因为在这种情况下完全讽刺.如果src_img为None,则比较为标量True,因此np.all将返回True.如果src_img是数值数组,则每个元素都将比较False,并np.all返回False.这个世界唯一一次给出错误的结果就是如果你有src_img一个对象数组,它的所有元素都是None.