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
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.
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.
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"
Pour moi, le travail suivant a fonctionné:
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
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.
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.
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.
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.
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