【问题标题】:CV2 Image Error: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'CV2 图像错误:错误:(-215:断言失败)!ssize.empty() in function 'cv::resize'
【发布时间】:2020-02-03 04:20:57
【问题描述】:

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

这是我得到的错误:

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'

【问题讨论】:

  • 你有损坏的图像吗?

标签: python image opencv tensorflow image-processing


【解决方案1】:

您的imread() 呼叫失败。它返回了None

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

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

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

img = cv2.imread(path)
if img is None:
    continue

顺便说一句:imread 的第二个参数中的3 表示IMREAD_COLOR | IMREAD_ANYDEPTH

【讨论】:

    【解决方案2】:

    我收到此错误是因为我向 cv2.resize() 提供了多张图片。

    resizedNumpyImage = cv2.resize(numpyArrayOfSingleImage,(neWidth,newHeight))

    【讨论】:

      【解决方案3】:

      更改终端上的目录对我有用!

      cd C:/Users.../图像位置

      【讨论】:

        【解决方案4】:

        我认为问题出在工作目录上。我也收到了同样的错误,当我更正我的工作目录时它得到了解决。下面是我从正确目录运行时的代码。

        def image_2_text(input_path,out_path):
         for ImgName in os.listdir(input_path):
        
            fullpath = os.path.join(input_path,ImgName)
            Img = cv2.imread(fullpath)
            text = pytesseract.image_to_string(Img,lang='eng')
            text = text.replace("\n"," ")
            text = " ".join(re.findall("[a-zA-Z]*",text))
            
            file_append = open(out_path,'a+')
            file_append.write(ImgName+'\t')
            file_append.write(text+'\n')
            file_append.close()
        print("Process Complete")
        

        【讨论】:

          【解决方案5】:

          在读取图像之前,请检查是否存在不存在的图像。在阅读图片之前试试这个:

          if not os.path.isfile(train_data):
              continue
          
          path = os.path.join(train_data, i)
          
          img = cv2.imread(path, 3)
          

          【讨论】:

            【解决方案6】:

            检查您尝试在 for 循环中迭代的文件夹中是否有 _DS_Store 文件,因为它不是图像文件 cv2.resize() 无法调整它的大小。

            【讨论】:

            • 这只是imread 无法阅读它被告知要阅读的内容的特例。在这些情况下,它将返回 None
            【解决方案7】:

            根据错误,输入中似乎存在一些问题。它应该是一个非空数组的列表。请验证任何损坏图像的路径和图像。另外,检查图像格式;如果存在任何 cv2.imread 无法读取的多波段 tiff 文件。

            尝试批量读取图像,以识别具有导致问题的图像的批次。

            【讨论】:

              【解决方案8】:

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

              image = cv2.imread('noexist.png')
              print(image.shape)
              

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

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

              OpenCV 不会抛出异常,直到你尝试对这个 NoneType 对象做一些事情。因此,在您尝试调整图像大小的下一行中,它会引发错误。这个简单的例子可以重现你的情况

              import cv2
              
              image = cv2.imread('noexist.jpg')
              resize = cv2.resize(image, (64,64))
              cv2.waitKey()
              

              请注意,如果您删除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()
              

              帧无效!

              【讨论】:

              • 您的某些图片之间有空格,例如Z (6).jpg,可能是读错了?尝试删除图像名称中的所有空格
              • 我在一组较小的图像上尝试了该程序,名称中没有空格,但我得到了同样的错误。
              • 更正 - 他们的
              • 事实上,如果我在没有图像的情况下运行它,它仍然会报错。
              • 通常当我遇到此错误时,99% 的时间是因为图像路径无效。在cv2.imread() 之后尝试print(img.shape),它应该立即诊断问题
              猜你喜欢
              • 2020-08-21
              • 1970-01-01
              • 2019-12-07
              • 2020-10-13
              • 2022-08-12
              • 1970-01-01
              • 2021-04-09
              • 2021-02-23
              • 2021-06-14
              相关资源
              最近更新 更多