web-dev-qa-db-fra.com

Echec du redimensionnement OpenCV sur une image de grande taille avec "erreur: (-215) ssize.area ()> dans la fonction cv :: resize"

J'utilise OpenCV 3.0.0 et Python 3.4.3 pour traiter une très grande image RVB (107162,79553,3). Pendant que j'essaye de le redimensionner en utilisant le code suivant: 

import cv2
image = cv2.resize(img, (0,0), fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)

J'ai eu ce message d'erreur à venir:
"cv2.error: C:\opencv-3.0.0\source\modules\imgproc\src\imgwarp.cpp: 3208: erreur: (-215) ssize.area ()> 0 dans la fonction cv :: resize "

Je suis certain qu'il y a un contenu d'image dans le tableau d'images car je peux les enregistrer dans de petites tuiles au format jpg. Lorsque j'essaie de redimensionner une petite partie de l'image, il n'y a pas de problème et je me retrouve avec une image correctement redimensionnée. (Prendre un gros morceau (50000,50000,3) ne fonctionnera toujours pas, mais cela fonctionnera sur un morceau (10000,10000,3)) 

Je me demande ce qui pourrait causer ce problème et comment je peux le résoudre? 

Merci

20
user3667217

Donc, il s'avère que le problème vient d'une ligne dans modules\imgproc\src\imgwarp.cpp:

CV_Assert( ssize.area() > 0 );

Lorsque le produit des lignes et des colonnes de l'image à redimensionner est supérieur à 2 ^ 31, ssize.area () donne un nombre négatif. Cela semble être un bogue dans OpenCV et, espérons-le, sera corrigé dans la prochaine version. Un correctif temporaire consiste à créer OpenCV avec cette ligne commentée. Bien que ce ne soit pas idéal, cela fonctionne pour moi. 

Et j’ai récemment découvert que ce qui précède ne s’applique qu’aux images dont la largeur est supérieure à la hauteur. Pour les images dont la hauteur est supérieure à la largeur, c'est la ligne suivante qui provoque une erreur: 

CV_Assert( dsize.area() > 0 );

Donc, cela doit être commenté aussi. 

19
user3667217

Il s’est avéré pour moi que cette erreur disait la vérité: j’essayais de redimensionner une image Null, qui était généralement la «dernière» image d’un fichier vidéo; 

Maintenant, il me reste une étape supplémentaire avant de tenter l'opération de redimensionnement, qui consiste à faire l'assertion moi-même:

def getSizedFrame(width, height):
"""Function to return an image with the size I want"""    
    s, img = self.cam.read()

    # Only process valid image frames
    if s:
            img = cv2.resize(img, (width, height), interpolation = cv2.INTER_AREA)
    return s, img

Maintenant, je ne vois pas l'erreur.

6
Kelton.Temby

Je sais que c'est un très vieux fil mais j'ai eu le même problème qui était dû aux espaces dans les noms d'images.

par exemple.

Nom de l'image: "hello o.jpg"

bizarrement, en supprimant les espaces, la fonction fonctionnait parfaitement.

Nom de l'image: "hello_o.jpg"

2
Wanderer

Pour moi, le travail suivant a fonctionné:

  • diviser le tableau en sous-tableaux plus petits
  • redimensionner les sous-tableaux
  • fusionner à nouveau les sous-tableaux

Voici le code:

def split_up_resize(arr, res):
    """
    function which resizes large array (direct resize yields error (addedtypo))
    """

    # compute destination resolution for subarrays
    res_1 = (res[0], res[1]/2)
    res_2 = (res[0], res[1] - res[1]/2)

    # get sub-arrays
    arr_1 = arr[0 : len(arr)/2]
    arr_2 = arr[len(arr)/2 :]

    # resize sub arrays
    arr_1 = cv2.resize(arr_1, res_1, interpolation = cv2.INTER_LINEAR)
    arr_2 = cv2.resize(arr_2, res_2, interpolation = cv2.INTER_LINEAR)

    # init resized array
    arr = np.zeros((res[1], res[0]))

    # merge resized sub arrays
    arr[0 : len(arr)/2] = arr_1
    arr[len(arr)/2 :] = arr_2

    return arr
1
Oli Blum

Il s’est avéré que j’avais un fichier .csv à la fin du dossier dans lequel je lisais toutes les images .

Assurez-vous qu'il ne s'agit que d'images et que vous n'avez aucun autre type de fichier.

0
empoleonrocks

Faites également attention au type d'objet de votre tableau numpy en le convertissant à l'aide de .astype('uint8') a résolu le problème pour moi.

0
Attila

Je travaillais avec 3 fichiers: le script python, l'image et le modèle formé.

Tout a fonctionné lorsque j'ai déplacé ces 3 fichiers dans leur propre dossier au lieu de dans le répertoire avec les autres scripts python.

0
Shane Rooney

Je vais avoir OpenCV version 3.4.3 sur MacOS . J'avais la même erreur que ci-dessus.

J'ai changé mon code de

frame = cv2.resize(frame, (0,0), fx=0.5, fy=0.5)   

à

frame = cv2.resize(frame, None, fx=0.5, fy=0.5)    

Maintenant cela fonctionne bien pour moi.

0
Biranchi

Dans mon cas, j'ai fait une mauvaise modification de l'image.

J'ai pu trouver le problème en vérifiant la forme de l'image.

print img.shape
0
Thomio