2014-05-13 14 views
8

Sto scrivendo un programma di OpenCV in python, e ad un certo punto ho qualcosa di similecv2.imread: verifica se l'immagine è in corso la lettura

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

# do stuff with image here 

Il problema è che ho per rilevare se il file di immagine viene letto correttamente prima di continuare. cv2.imread restituisce False se non in grado di aprire l'immagine, quindi penso di fare qualcosa di simile:

if (img): 
    #continue doing stuff 

Quello che succede è che se l'immagine non viene aperta (ad esempio se il file non esiste) img è pari a None (come previsto). Tuttavia, quando imread opere, la condizione, si rompe:

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

vale a dire la tornata numpy.ndarray non può essere utilizzato come un valore booleano. Il problema sembra essere che imread restituisca numpy.ndarray se ha successo e False (booleano) altrimenti.

La mia soluzione prevede finora utilizzando la type del valore restituito come segue:

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

ma mi chiedevo: non c'è una soluzione più bello, più vicino al controllo iniziale if(img): #do stuff?

risposta

19

È possibile utilizzare semplicemente if not img is None o, equivallentemente, if img is not None. Non è necessario controllare esplicitamente il tipo.

Si noti che None e False sono non lo stesso valore. Tuttavia, bool(None)==False, motivo per cui if None non riesce.

+0

sai se provare a leggere un'immagine inesistente usando imread genera un cv2.error o qualcosa di simile? – waspinator

+4

@waspinator la documentazione afferma che 'Se l'immagine non può essere letta (a causa di file mancanti, permessi impropri, formato non supportato o non valido), la funzione restituisce una matrice vuota' – goncalopp

2

Se si desidera scrivere il contenuto non appena viene generato il file di immagine, è possibile utilizzare os.path.isfile() che restituisce un valore bool in base alla presenza di un file nella directory specificata.

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) 

Si può anche fare riferimento a docs un'applicazione dettagliata di ciascun metodo e operazioni di immagine di base.

Problemi correlati