web-dev-qa-db-fra.com

cv2.imread: vérification de la lecture de l'image

J'écris un programme OpenCV en python, et à un moment donné, j'ai quelque chose comme

import cv2
import numpy as np
... 
img = cv2.imread("myImage.jpg")

# do stuff with image here 

Le problème est que je dois détecter si le fichier image est correctement lu avant de continuer. cv2.imread Renvoie False s'il n'est pas en mesure d'ouvrir l'image, je pense donc à faire quelque chose comme:

if (img):
   #continue doing stuff

Ce qui se passe, c'est que si l'image n'est pas ouverte (par exemple si le fichier n'existe pas) img est égal à None (comme prévu). Cependant, lorsque imread fonctionne, la condition se rompt:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

c'est-à-dire que le numpy.ndarray retourné ne peut pas être utilisé comme un booléen. Le problème semble être que imread renvoie numpy.ndarray en cas de succès et False (booléen) sinon.

Jusqu'à présent, ma solution consiste à utiliser le type de la valeur renvoyée comme suit:

if (type(img) is np.ndarray): 
     #do stuff with image

Mais je me demandais: n'y a-t-il pas une meilleure solution, plus proche de la vérification initiale if(img): #do stuff?

13
Яois

Si vous êtes sûr que la valeur de img est None dans votre cas, vous pouvez simplement utiliser if not img is None Ou, de manière équivalente, if img is not None. Vous n'avez pas besoin de vérifier explicitement le type.

Notez que None et False sont pas la même valeur. Cependant, bool(None)==False, c'est pourquoi if None Échoue.

La documentation de imread, à la fois pour OpenCV 2 et 3, indique cependant qu'une matrice vide doit être retournée en cas d'erreur. Vous pouvez vérifier cela en utilisant if img.size ==0

38
goncalopp

Si vous voulez écrire le contenu dès que le fichier image est généré, vous pouvez utiliser os.path.isfile() qui retourne une valeur bool en fonction de la présence d'un fichier dans le répertoire donné.

import cv2 
import os.path

while not os.path.isfile("myImage.jpg"):
    #ignore if no such file is present.
    pass

img = cv2.imread("myImage.jpg", 0)

cv2.imwrite("result.jpg", img)

Vous pouvez également vous référer à docs pour une implémentation détaillée de chaque méthode et des opérations d'image de base.

4
ZdaR