erro de cv aberto: (-215) scn == 3 || scn == 4 na função cvtColor

89

Atualmente estou no Ubuntu 14.04, usando python 2.7 e cv2.

Quando executo este código:

import numpy as np
import cv2

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

retorna:

 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

Já pesquisei aqui e uma resposta disse que posso estar carregando minha foto do jeito errado, pois ela deveria ter 3 dimensões: linhas, colunas e profundidade.

Quando imprimo o img.shape ele retorna apenas dois números, então devo estar fazendo errado. Mas não sei a maneira correta de carregar minha foto.

Arthurckl
fonte
11
img = cv2.imread('2015-05-27-191152.jpg',0)o parâmetro 0 já carrega sua imagem como uma imagem em tons de cinza de 1 canal. Portanto, experimente img = cv2.imread('2015-05-27-191152.jpg')ou gray = cv2.imread('2015-05-27-191152.jpg',0)dê uma olhada em sinalizadores diferentes em: docs.opencv.org/modules/highgui/doc/…
Micka
Eu também tive esse problema, mas acabou havendo um espaço ( .../eclipse\ footage/...) no meu caminho. Portanto, adicionar um ...,0)não corrigiu.
Cody

Respostas:

102

Forneça o caminho completo da imagem com barra. Isso resolveu o erro para mim.

Por exemplo

import numpy as np
import cv2

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

Além disso, se você fornecer o 0segundo parâmetro ao carregar a imagem usando do cv2.imreadque não precisar converter a imagem usando cvtColor, ela já será carregada como imagem em tons de cinza, por exemplo.

import numpy as np
import cv2

gray = cv2.imread('C:/Python34/images/2015-05-27-191152.jpg',0)
AdityaIntwala
fonte
6
Caso você esteja capturando uma imagem de uma câmera: você obterá este erro se a câmera não estiver acessível.
ger.s.brett 01 de
... ou se você fornecer um caminho errado para o seu arquivo de vídeo; P Encontrei este problema quando baguncei o caminho do maldito windows (escrevendo c: / em vez de C: //)
fanny
17

Defina como abaixo

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
Kalarav Parmar
fonte
6
img = cv2.imread('2015-05-27-191152.jpg',0)

A linha de código acima lê sua imagem em um modelo de cores em tons de cinza, por causa do 0 anexado no final. E se você tentar novamente converter uma imagem já cinza em uma imagem cinza, esse erro será mostrado.

Portanto, use o estilo acima ou tente o código abaixo mencionado:

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

Passe apenas o nome da imagem, sem necessidade de 0:

img=cv2.imread('sample.jpg')
Supriya Junghare
fonte
4

A primeira coisa que você deve verificar é se a imagem existe no diretório raiz ou não. Isso se deve principalmente à imagem com altura = 0. O que significa que cv2.imread(imageName)não está lendo a imagem.

Farooq Khan
fonte
Essa resposta resolve meu problema - eu leio o vídeo, ele não para automaticamente quando o vídeo termina, então recebo o mesmo erro ao tentar cv2.cvtColorpara o quadro vazio.
Mikhail_Sam
2

Esta mensagem de erro foi exibida por motivos totalmente não relacionados aos sinalizadores 0 ou 1 mencionados nas outras respostas. Você pode estar vendo isso também, porque nãocv2.imread ocorrerá um erro se a string do caminho que você passar não for uma imagem:

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

Portanto, você está vendo uma cvtColorfalha quando, na verdade, é um imreaderro silencioso . Lembre-se disso da próxima vez que perder uma hora de sua vida com essa metáfora enigmática .

Solução

Pode ser necessário verificar se a string do caminho representa um arquivo válido antes de passá-lo para 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)

Escrito dessa forma, seu código falhará normalmente.

François Leblanc
fonte
1

Esta resposta se aplica às pessoas com o mesmo problema ao tentar acessar a câmera.

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()

Usando Linux:

Se você está tentando acessar a câmera de seu computador, provavelmente há um problema de permissão, tente executar o script python com sudo para corrigir isso.

sudo python python_script.py

Para testar se a câmera está acessível, execute o seguinte comando.

ffmpeg -f v4l2 -framerate 25 -video_size 640x480 -i /dev/video0 output.mkv 
ehivan24
fonte
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

O erro acima é o resultado de um nome de imagem inválido ou se o arquivo não existe no diretório local.

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

Além disso, se você estiver usando o segundo argumento de cv2.imread () como '0', então ele já foi convertido em uma imagem em escala de cinza.

A diferença entre converter a imagem passando 0 como parâmetro e aplicando o seguinte:

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

é que, no caso img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY), as imagens são imagens do tipo 8uC1 e 32sC1.

Shikhar Johri
fonte
1

Este código para aqueles que estão enfrentando o mesmo problema ao tentar acessar a câmera pode ser escrito com uma verificação de segurança.

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

OU caso você queira fechar a câmera / descontinuar se houver algum problema com o próprio quadro

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

Para referência https://github.com/HackerShackOfficial/AI-Smart-Mirror/issues/36

Vivek Patwari
fonte
0

Aqui está o que observei quando usei meus próprios conjuntos de imagens no .jpgformato. No script de amostra disponível no documento Opencv , observe que ele possui as linhas undistorte crop the imageconforme abaixo:

# 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)

Portanto, quando executamos o código pela primeira vez, ele executa a linha cv2.imwrite('calibresult.jpg',dst)salvando uma imagem calibresult.jpgno diretório atual. Então, quando executei o código da próxima vez, junto com meus conjuntos de imagens de amostra que usei para calibrar a câmera no formato jpg, o código também tentou considerar esta imagem recém-adicionada calibresult.jpgdevido à qual o erro apareceu

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

O que fiz foi: simplesmente apaguei a imagem recém-gerada após cada execução ou, alternativamente, alterei o tipo de imagem para dizer pngou tiffdigitar. Isso resolveu o problema. Verifique se você está inserindo e escrevendo calibresultdo mesmo tipo. Nesse caso, basta alterar o tipo.

Bhanu Chander
fonte
0

No OS XI percebi que, embora cv2.imread possa lidar com "nomedoarquivo.jpg", ele não pode processar "arquivo.nome.jpg". Sendo um novato em python, ainda não posso propor uma solução, mas como François Leblanc escreveu, é mais um erro de leitura silencioso.

Portanto, ele tem um problema com um ponto adicional no nome do arquivo e provavelmente outros sinais também, como com "" (Espaço) ou "%" e assim por diante.

Francis
fonte
0

Também descobri que se sua webcam não fecha direito ou algo está usando, então o CV2 vai dar o mesmo erro. Tive que reiniciar meu pc para fazê-lo funcionar novamente.

MNM
fonte
0

A solução mais simples para remover esse erro era executar o comando

cap.release()
cv2.closeAllWindows()

Isso funcionou para mim e às vezes também era necessário reiniciar o kernel por causa de processos antigos em execução em segundo plano.

Se a imagem não estiver no diretório de trabalho, então também não funcionará para isso, tente colocar o arquivo de imagem em pwd na mesma pasta, pois há código, caso contrário, forneça o caminho completo para o arquivo ou pasta de imagem.

Para evitar esse problema no futuro, tente codificar com manipulação excepcional, de forma que, se o encerramento incorreto acontecer por algum motivo aleatório, o dispositivo de captura seja liberado após o término do programa.

Vinay Verma
fonte
0

2015-05-27-191152.jpg << Olhando para trás em seu formato de imagem, eu ocasionalmente confundi entre .png e .jpg e encontrei o mesmo erro.

Hong Son Nguyen
fonte
0

Acho que é porque cv2.imreadnão consegue ler a .jpgimagem, você precisa mudar .jpgpara .png.

Shenmeme
fonte