0


我正在为我的程序创建一个故障保护功能,因此只要图像不存在,或者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()

这在没有图像的情况下有效,但是当有图像时,它会报错:

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

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

AttributeError: 'NoneType' object has no attribute 'all'

如果给出图像或没有给出图像,有没有办法在不收到这些错误消息的情况下实际执行此操作并工作。

4

1 回答 1

5

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

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

if src_img is None:

is比较原始引用。这是检查 None 的推荐方法,因为它要快得多并且 None 是单例。

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

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

于 2018-08-20T04:41:58.970 回答