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
?
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
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.