CV2 图像错误:错误:(-215:断言失败)!函数“cv::resize”中的 ssize.empty()

Wil*_*wns 8 python opencv image image-processing tensorflow

我正在使用 TensorFlow 和 Python 制作图像分类器,但使用 CV2 读取图像时出错。我对 CV2 很陌生,我还没有找到任何可以充分解决我的问题的东西。谁能解释一下如何解决这个问题?

def train_data_with_label():
  train_images = []
  for i in tqdm(os.listdir(train_data)):
    path = os.path.join(train_data, i)
    img = cv2.imread(path, 3)
    img = cv2.resize(img, (64,64))
    train_images.append([np.array(img), one_hot_label(i)])
  shuffle(train_images)
  return train_images
  
def test_data_with_label():
  test_images = []
  for i in tqdm(os.listdir(test_data)):
    path = os.path.join(test_data, i)
    img = cv2.imread(path, 3)
    img = cv2.resize(img, (64,64))
    test_images.append([np.array(img), one_hot_label(i)])
  shuffle(test_images)
  return test_images
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

Using TensorFlow backend.
  0%|                                                                                            | 0/2 [00:00<?, ?it/s]
Traceback (most recent call last):
  File "retrain.py", line 47, in <module>
    training_images = train_data_with_label()
  File "retrain.py", line 32, in train_data_with_label
    img = cv2.resize(img, (64,64))
cv2.error: OpenCV(4.1.1) C:\projects\opencv-python\opencv\modules\imgproc\src\resize.cpp:3720: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'
Run Code Online (Sandbox Code Playgroud)

Chr*_*itz 5

您的imread()通话失败。它回来了None

当您尝试访问imread()不存在的文件,或者它不是正确的图片文件时,imread通过返回None(在 Python 中)而不是正确的 numpy 数组来发出信号。

现在,当您将其传递None给时resize()resize()会注意到并抛出此错误。它尝试检查参数是否是正确的数组,并且不是空数组。在这种情况下,您的参数甚至不是数组,但错误是相同的。

如何解决这个问题:检查的结果是否imread()None. 如果是None,则读取失败。只需继续循环到下一个图片文件名。

img = cv2.imread(path)
if img is None:
    continue
Run Code Online (Sandbox Code Playgroud)

顺便说一下:3第二个参数中的theimread意味着IMREAD_COLOR | IMREAD_ANYDEPTH


nat*_*ncy 2

您可能正在读取无效的零像素图像。检查您的图像路径,因为源图像的大小很可能是空的并且尚未正确读入。您可以检查图像的形状以确保它具有有效的(height, width, channels)尺寸,如下所示

image = cv2.imread('noexist.png')
print(image.shape)
Run Code Online (Sandbox Code Playgroud)

如果您收到AttributeError与此类似的错误,则意味着您的图像路径无效/已损坏。

Traceback (most recent call last):
  File ".\test.py", line 4, in <module>
    print(image.shape)
AttributeError: 'NoneType' object has no attribute 'shape'
Run Code Online (Sandbox Code Playgroud)

在您尝试对此对象执行某些操作之前,OpenCV 不会抛出异常NoneType。因此,在下一行中,当您尝试调整图像大小时,它会抛出错误。通过这个简单的例子可以重现您的情况

import cv2

image = cv2.imread('noexist.jpg')
resize = cv2.resize(image, (64,64))
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)

请注意,如果删除cv2.resize(),则不会引发异常。要解决您的问题,您可以使用cv2.errortry/except来捕获异常

import cv2

image = cv2.imread('noexist.jpg')
try:
    resize = cv2.resize(image, (64,64))
except cv2.error as e:
    print('Invalid frame!')
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)

无效框架!