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
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é.
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.
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
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"
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
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