繁体   English   中英

CV2 图像错误:错误:(-215:Assertion failed).ssize:empty() in function 'cv::resize'

[英]CV2 Image Error: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'

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

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

您可能正在读取无效的零像素图像。 检查您的图像路径,因为源图像的大小很可能是空的并且没有正确读取。 您可以检查图像的形状以确保它具有像这样的有效(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 object 执行某些操作。 因此,在您尝试调整图像大小的下一行中,它会引发错误。 这个简单的例子可以重现你的情况

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

帧无效!

您的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 IMREAD_COLOR | IMREAD_ANYDEPTH

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

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

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

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

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

img = cv2.imread(path, 3)

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

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

我收到此错误是因为我将多个图像提供给cv2.resize()

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

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

cd C:/用户.../图像位置

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM