OpenCV resize échoue sur la grande image avec " error: (-215) sSize.zone ()> 0 en fonction cv:: redimensionner"

J'utilise OpenCV 3.0.0 et Python 3.4.3 pour traiter une très grande image RGB (107162,79553,3). Pendant que j'essaie 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 arrive :

"cv2.erreur: C:opencv-3.0.0sourcemodulesimgprocsrcimgwarp.cpp: 3208: erreur: (-215) ssize.zone () > 0 dans la fonction cv::redimensionner"

je suis certain qu'il y a du contenu image dans le tableau image parce que je peux les enregistrer dans de petites tuiles au format jpg. Lorsque J'essaie de redimensionner juste une petite partie de l'image, il n'y a aucun problème et je finis avec une image correctement redimensionnée. (Prendre un assez gros morceau (50000 5000000,3) ne fonctionnera toujours pas, mais il fonctionnera sur un (1000010000,3) morceau)

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

Merci

20
demandé sur user3667217 2015-08-13 22:00:21

6 réponses

il s'avère Donc que le problème vient de la ligne 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.zone() génère un nombre négatif. Ceci semble être un bug dans OpenCV et devrait être corrigé dans la prochaine version. Une solution temporaire est de construire OpenCV avec cette ligne commentée. Bien que pas idéal, il fonctionne pour moi.

et je viens de découvrir que ce qui précède s'applique seulement image 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 cause l'erreur:

CV_Assert( dsize.area() > 0 );

Donc ce doit être commenté.

18
répondu user3667217 2017-02-14 05:09:20

Il S'avère pour moi que cette erreur disait en fait la vérité - j'essayais de redimensionner une image nulle, qui était habituellement la 'dernière' image d'un fichier vidéo, donc l'affirmation était valide.

Maintenant, j'ai une étape supplémentaire avant de tenter l'opération de redimensionnement, qui est de faire l'affirmation selon moi:

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
répondu Kelton.Temby 2016-09-09 07:22:50

Pour moi, le travail autour de travaillé:

  • diviser le tableau en plus petits sous-tableaux
  • redimensionner les sous-tableaux
  • fusionner 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
répondu Oli Blum 2017-03-13 15:29:37

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

e.g.

nom de L'Image: "hello o.jpg"

bizarrement, en enlevant les espaces, la fonction fonctionnait très bien.

nom de L'Image: "hello_o.jpg"

1
répondu user7631183 2017-05-30 10:50:41

s'avère que j'avais une .fichier csv à la fin du dossier d'où je lisais toutes les images. Une fois que j'ai supprimé que ça a bien fonctionné!--1-->

assurez-vous que ce ne sont que des images et que vous n'avez aucun autre type de fichier

0
répondu empoleonrocks 2018-01-06 09:31:40

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

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

print img.shape
0
répondu Thomio 2018-06-28 14:34:42