errore cv aperto: (-215) scn == 3 || scn == 4 nella funzione cvtColor


89

Attualmente sono in Ubuntu 14.04, utilizzando python 2.7 e cv2.

Quando eseguo questo codice:

import numpy as np
import cv2

img = cv2.imread('2015-05-27-191152.jpg',0)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ritorna:

 File "face_detection.py", line 11, in <module>
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.error: /home/arthurckl/Desktop/opencv-3.0.0-rc1/modules/imgproc/src/color.cpp:7564: error: (-215) scn == 3 || scn == 4 in function cvtColor

Ho già cercato qui e una risposta ha detto che potrei caricare la mia foto nel modo sbagliato, perché dovrebbe avere 3 dimensioni: righe, colonne e profondità.

Quando stampo img.shape, restituisce solo due numeri, quindi devo sbagliarmi. Ma non conosco il modo giusto per caricare la mia foto.


11
img = cv2.imread('2015-05-27-191152.jpg',0)il parametro 0 carica già la tua immagine come immagine in scala di grigi a 1 canale. Quindi prova img = cv2.imread('2015-05-27-191152.jpg')o dai gray = cv2.imread('2015-05-27-191152.jpg',0)un'occhiata a diversi flag su: docs.opencv.org/modules/highgui/doc/…
Micka

Ho anche avuto questo problema, ma si è scoperto che c'era uno spazio ( .../eclipse\ footage/...) nel mio percorso. Quindi l'aggiunta di un ...,0)non lo ha risolto.
Cody

Risposte:


102

Dai il percorso completo dell'immagine con la barra in avanti. Ha risolto l'errore per me.

Per esempio

import numpy as np
import cv2

img = cv2.imread('C:/Python34/images/2015-05-27-191152.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Inoltre, se fornisci il 0secondo parametro durante il caricamento dell'immagine utilizzando cv2.imreadche non è necessario convertire l'immagine utilizzando cvtColor, è già caricata come immagine in scala di grigi, ad es.

import numpy as np
import cv2

gray = cv2.imread('C:/Python34/images/2015-05-27-191152.jpg',0)

6
Nel caso in cui stai catturando un'immagine da una fotocamera: ottieni questo errore se la fotocamera non è accessibile.
ger.s.brett

... o se fornisci un percorso sbagliato al tuo file video; P Ho riscontrato questo problema mentre ho incasinato il dannato percorso di Windows (scrivendo c: / invece di C: //)
fanny

17

Si prega di impostare come sotto

img = cv2.imread('2015-05-27-191152.jpg',1)     // Change Flag As 1 For Color Image
                                                //or O for Gray Image So It image is 
                                                //already gray

6
img = cv2.imread('2015-05-27-191152.jpg',0)

La riga di codice sopra legge la tua immagine nel modello di colore in scala di grigi, a causa dello 0 aggiunto alla fine. E se provi di nuovo a convertire un'immagine già grigia in un'immagine grigia, verrà visualizzato quell'errore.

Quindi usa lo stile sopra o prova il codice sotto menzionato:

img = cv2.imread('2015-05-27-191152.jpg')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)


4

La prima cosa che dovresti controllare è che l'immagine esista o meno nella directory principale. Ciò è dovuto principalmente all'immagine con altezza = 0. Ciò significa che cv2.imread(imageName)non sta leggendo l'immagine.


Questa risposta risolve il mio problema: leggo il video, non si ferma automaticamente al termine del video, quindi ottengo lo stesso errore provando a cv2.cvtColorper frame vuoto.
Mikhail_Sam

2

Ho visualizzato questo messaggio di errore, per motivi completamente estranei ai flag 0 o 1 menzionati nelle altre risposte. Si potrebbe vedere troppo perché cv2.imreadsarà non all'errore se la stringa di percorso si passa non è un'immagine:

In [1]: import cv2
   ...: img = cv2.imread('asdfasdf')  # This is clearly not an image file
   ...: gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
   ...:

OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cv::cvtColor, file C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp, line 10638
---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
<ipython-input-4-19408d38116b> in <module>()
      1 import cv2
      2 img = cv2.imread('asdfasdf')  # This is clearly not an image file
----> 3 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

error: C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:10638: error: (-215) scn == 3 || scn == 4 in function cv::cvtColor

Quindi stai vedendo un cvtColorfallimento quando in realtà è un imreaderrore silenzioso . Tienilo a mente la prossima volta che sprechi un'ora della tua vita con quella metafora criptica .

Soluzione

Potrebbe essere necessario verificare che la stringa del percorso rappresenti un file valido prima di passarlo a cv2.imread:

import os


def read_img(path):
    """Given a path to an image file, returns a cv2 array

    str -> np.ndarray"""
    if os.path.isfile(path):
        return cv2.imread(path)
    else:
        raise ValueError('Path provided is not a valid file: {}'.format(path))


path = '2015-05-27-191152.jpg'
img = read_img(path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Scritto in questo modo, il codice non funzionerà correttamente.


1

Questa risposta se per le persone che riscontrano lo stesso problema tentando di accedere alla telecamera.

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

Utilizzando Linux:

se stai tentando di accedere alla fotocamera dal tuo computer molto probabilmente c'è un problema di autorizzazione, prova a eseguire lo script python con sudo dovrebbe risolverlo.

sudo python python_script.py

Per verificare se la telecamera è accessibile, eseguire il comando seguente.

ffmpeg -f v4l2 -framerate 25 -video_size 640x480 -i /dev/video0 output.mkv 

1
cv2.error: /home/arthurckl/Desktop/opencv-3.0.0-rc1/modules/imgproc/src/color.cpp:7564: error: (-215) scn == 3 || scn == 4 in function cvtColor

L'errore precedente è il risultato di un nome di immagine non valido o se il file non esiste nella directory locale.

img = cv2.imread('2015-05-27-191152.jpg',0)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Inoltre, se stai usando il secondo argomento di cv2.imread () come '0', allora è già convertito in un'immagine in scala di grigi.

La differenza tra la conversione dell'immagine passando 0 come parametro e l'applicazione di quanto segue:

img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY) 

è che, nel caso img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY), le immagini sono di tipo 8uC1 e 32sC1.


1

Questo codice per coloro che stanno riscontrando lo stesso problema cercando di accedere alla telecamera potrebbe essere scritto con un controllo di sicurezza.

if ret is True:
   gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
else:
   continue

OPPURE nel caso in cui si desideri chiudere la fotocamera / interrompere la produzione se ci saranno problemi con la cornice stessa

if ret is True:
   gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
else:
   break

Per riferimento https://github.com/HackerShackOfficial/AI-Smart-Mirror/issues/36


0

Ecco cosa ho osservato quando ho utilizzato i miei set di immagini in .jpgformato. Nello script di esempio disponibile nel documento Opencv , nota che ha le linee undistorte crop the imagecome di seguito:

# undistort
dst = cv2.undistort(img, mtx, dist, None, newcameramtx)

# crop the image
x,y,w,h = roi
dst = dst[y:y+h, x:x+w]
cv2.imwrite('calibresult.jpg',dst)

Quindi, quando eseguiamo il codice per la prima volta, esegue la riga cv2.imwrite('calibresult.jpg',dst)salvando un'immagine calibresult.jpgnella directory corrente. Quindi, quando ho eseguito il codice per la prossima volta, insieme ai miei set di immagini di esempio che ho usato per calibrare la fotocamera in formato jpg, il codice ha anche provato a considerare questa immagine appena aggiunta a calibresult.jpgcausa della quale l'errore è saltato fuori

error: C:\builds\master_PackSlaveAddon-win64-vc12-static\opencv\modules\imgproc\src\color.cpp:7456: error: (-215) scn == 3 || scn == 4 in function cv::ipp_cvtColor

Quello che ho fatto è stato: ho semplicemente cancellato l'immagine appena generata dopo ogni esecuzione o in alternativa ho cambiato il tipo di immagine in dire pngo tiffdigitare. Questo ha risolto il problema. Controlla se stai inserendo e scrivendo calibresultdello stesso tipo. In tal caso, cambia semplicemente il tipo.


0

Su OS X mi sono reso conto che mentre cv2.imread può gestire "filename.jpg" non può elaborare "file.name.jpg". Essendo un principiante di Python, non posso ancora proporre una soluzione, ma come ha scritto François Leblanc, è più un silenzioso errore di lettura.

Quindi ha un problema con un punto aggiuntivo nel nome del file e probabilmente anche con altri segni, come con "" (Spazio) o "%" e così via.


0

Ho anche scoperto che se la tua webcam non si è chiusa correttamente o qualcosa la sta usando, CV2 darà lo stesso errore. Ho dovuto riavviare il mio PC per farlo funzionare di nuovo.


0

La soluzione più semplice per rimuovere quell'errore è stata l'esecuzione del comando

cap.release()
cv2.closeAllWindows()

Per me ha funzionato e talvolta è stato anche necessario riavviare il kernel a causa di vecchi processi in esecuzione in background.

Se l'immagine non è nella directory di lavoro, non funzionerà nemmeno per provare a posizionare il file immagine in pwd nella stessa cartella in cui è presente il codice, altrimenti fornire il percorso completo al file o alla cartella dell'immagine.

Per evitare questo problema in futuro, provare a codificare con una gestione eccezionale in modo che se si verifica una terminazione errata per qualche motivo casuale, il dispositivo di acquisizione verrà rilasciato dopo che il programma è terminato.


0

2015-05-27-191152.jpg << Guardando indietro al formato della tua immagine, di tanto in tanto ho confuso tra .png e .jpg e ho riscontrato lo stesso errore.


0

Penso che in quanto cv2.imreadnon è in grado di leggere .jpgimmagini, è necessario modificare .jpga .png.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.