3
votes

Erreur d'image CV2: erreur: (-215: échec de l'assertion)! Ssize.empty () dans la fonction 'cv :: resize'

Je crée un classificateur d'images avec TensorFlow et Python, mais j'ai une erreur lors de la lecture des images avec CV2. Je suis très nouveau sur CV2, et je n'ai rien trouvé qui résout suffisamment mon problème. Quelqu'un peut-il expliquer comment résoudre ce problème?

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'

Voici l'erreur que j'ai:

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


1 commentaires

Avez-vous des images corrompues?


6 Réponses :


0
votes

Vous lisez probablement une image de zéro pixel non valide. Vérifiez le chemin de votre image car la taille de votre image source est très probablement vide et n'a pas été lue correctement. Vous pouvez vérifier la forme de l'image pour vous assurer qu'elle a une dimension valide (height, width, channels) comme celle-ci

import cv2

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

Si vous obtenez une erreur AttributeError similaire à celle-ci, cela signifie que le chemin de votre image est invalide / corrompu.

import cv2

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

OpenCV ne lèvera pas d'exception tant que vous n'aurez pas essayé de faire quelque chose avec cet objet NoneType . Ainsi, dans la ligne suivante, lorsque vous essayez de redimensionner l'image, l'erreur est générée. Votre situation est reproductible avec cet exemple simple

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

Notez que si vous supprimez le cv2.resize() , une exception ne sera pas levée. Pour résoudre votre problème, vous pouvez utiliser cv2.error et un bloc try/except pour intercepter l'exception

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

Cadre invalide!


5 commentaires

Certaines de vos images ont des espaces entre les deux, comme Z (6).jpg , peut-être que cela pourrait être mal lu? Essayez de supprimer tous les espaces dans les noms d'image


J'ai essayé le programme sur un plus petit ensemble d'images sans espaces dans leurs noms, mais j'ai eu la même erreur.


Correction - leur


En fait, si je l'exécute sans images, cela donne toujours cette erreur.


Habituellement, lorsque je rencontre cette erreur, 99% du temps, c'est à cause d'un chemin d'image non valide. Essayez print(img.shape) juste après cv2.imread() , cela devrait diagnostiquer le problème immédiatement



0
votes

Sur la base de l'erreur, il semble qu'il y ait un problème dans l'entrée. Ce devrait être une liste de tableaux non vides. Veuillez vérifier le chemin et les images de toute image corrompue. Vérifiez également les formats d'image; si un fichier tiff multibande est présent que cv2.imread ne peut pas lire.

Essayez de lire les images par lots pour identifier le lot contenant l'image à l'origine du problème.


0 commentaires

2
votes

vérifiez s'il y a un fichier _DS_Store dans le dossier que vous essayez d'itérer dans la boucle for, car ce n'est pas un fichier image cv2.resize () ne peut pas le redimensionner.


0 commentaires

0
votes

Avant de lire l'image, vérifiez s'il existe une image inexistante. Essayez ceci avant de lire les images:

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

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

img = cv2.imread(path, 3)


0 commentaires

0
votes

Je pense que le problème vient du répertoire de travail. J'ai également reçu la même erreur et elle a été résolue lorsque j'ai corrigé mon répertoire de travail. Voici mon code qui a fonctionné lorsqu'il est exécuté à partir du bon répertoire.

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


0 commentaires

0
votes

J'obtenais cette erreur uniquement bcoz je transmettais plusieurs images au cv2.resize ().

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


0 commentaires