2014-05-13 11 views
8

Piszę program OpenCV w python, a w pewnym momencie mam coś podobnegocv2.imread: sprawdzenie, czy obraz jest odczytywany

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

# do stuff with image here 

Problemem jest to, że mam do wykrycia, jeśli plik obrazu jest poprawnie czytany przed kontynuowaniem. cv2.imread powraca False jeśli nie jest w stanie otworzyć obraz, więc myślę, że robi coś takiego:

if (img): 
    #continue doing stuff 

Co się dzieje, że jeśli obraz nie jest otwarta (na przykład, jeśli plik nie istnieje) img jest równa None (zgodnie z oczekiwaniami). Jednak, gdy imread prace, warunek, łamie:

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

czyli powrócił numpy.ndarray nie może być stosowany jako wartość logiczną. Problem wydaje się być, że imread zwraca numpy.ndarray, jeśli powodzenie i False (boolean) w przeciwnym razie.

Moje rozwiązanie jakim wiąże się z wykorzystaniem type zwróconego wartości następująco:

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

Ale zastanawiałem się: nie ma ładniejszy rozwiązanie, bliżej do wstępnego sprawdzenia if(img): #do stuff?

Odpowiedz

19

Możesz po prostu użyć if not img is None, lub, równoważnie, if img is not None. Nie musisz wyraźnie sprawdzać typu.

Należy pamiętać, że None i Falsenie o tej samej wartości. Jednak bool(None)==False, dlatego nie działa if None.

+0

czy wiesz, że próba odczytania nieistniejącego obrazu przy użyciu imread'a rzuca cv2.error lub coś podobnego? – waspinator

+4

@waspinator dokumentacja stwierdza, że ​​'Jeśli obraz nie może być odczytany (z powodu braku pliku, nieprawidłowych uprawnień, nieobsługiwanego lub nieprawidłowego formatu), funkcja zwraca pustą matrycę'' – goncalopp

2

Jeśli chcesz zapisać zawartość zaraz po wygenerowaniu pliku obrazu, możesz użyć wartości os.path.isfile(), która zwraca wartość bool w zależności od obecności pliku w podanym katalogu.

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) 

Można również zapoznać się docs szczegółowego wdrożenia każdej metody i podstawowych operacji graficznych.

Powiązane problemy