cv2.imread: comprobando si la imagen se está leyendo

Estoy escribiendo un progtwig OpenCV en Python, y en algún momento tengo algo como

import cv2 import numpy as np ... img = cv2.imread("myImage.jpg") # do stuff with image here 

El problema es que tengo que detectar si el archivo de imagen se está leyendo correctamente antes de continuar. cv2.imread devuelve False si no puedo abrir la imagen, así que pienso en hacer algo como:

 if (img): #continue doing stuff 

Lo que sucede es que si la imagen no se abre (por ejemplo, si el archivo no existe), img es igual a None (como se esperaba). Sin embargo, cuando funciona imread , la condición, se rompe:

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

es decir, el numpy.ndarray devuelto no se puede utilizar como un valor booleano. El problema parece ser que imread devuelve numpy.ndarray si tiene éxito y False (booleano) de lo contrario.

Mi solución hasta ahora implica usar el type del valor devuelto de la siguiente manera:

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

Pero me preguntaba: ¿no hay una solución mejor, más cercana a la comprobación inicial if(img): #do stuff ?

Si está seguro de que el valor de img es None en su caso, simplemente puede utilizarlo if not img is None o, de manera equivalente, if img is not None . No es necesario verificar el tipo explícitamente.

Tenga en cuenta que None y False no tienen el mismo valor. Sin embargo, bool(None)==False , por lo que if None no falla.

La documentación para imread , tanto para OpenCV 2 como para la 3, indica, sin embargo, que una matriz vacía debe devolverse en caso de error. Puede verificar if img.size ==0 usa if img.size ==0

Si desea escribir el contenido tan pronto como se genere el archivo de imagen, puede usar os.path.isfile() que devuelve un valor bool dependiendo de la presencia de un archivo en el directorio dado.

 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) 

También puede consultar los documentos para la implementación detallada de cada método y las operaciones de imagen básicas.