CV2图像错误:错误:(-215:Assertion失败)函数'cv :: resize'中的!ssize.empty()

时间:2019-10-04 20:43:58

标签: python image opencv tensorflow image-processing

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

7 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

您可能正在读取无效的零像素图像。由于源图像的大小很可能是空的并且没有被正确读取,因此请检查图像路径。您可以检查图像的形状以确保其具有有效的(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'

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

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()
  

无效的帧!

答案 2 :(得分:0)

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

尝试分批读取图像,以识别具有引起问题的图像的批次。

答案 3 :(得分:0)

在读取图像之前,请检查是否存在不存在的图像。在读取图像之前,请尝试以下操作:

if not os.path.isfile(train_data):
    continue

path = os.path.join(train_data, i)

img = cv2.imread(path, 3)

答案 4 :(得分:0)

我认为问题在于工作目录。我也收到了同样的错误,并且在我更正工作目录时已解决。下面是我的代码,当从正确的目录运行时,它们可以工作。

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 :(得分:0)

仅当我将多个图像馈送到cv2.resize()时,我才遇到此错误。

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

答案 6 :(得分:0)

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

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