Estou tentando aprender cv2 em python 2.7, mas quando executo meu código, na parte específica dele:
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
img = cv2.imread('2015-05-27-191152.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
ele retorna este:
File "face_detection.py", line 11, in <module>
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
cv2.error: /home/arthurckl/Desktop/opencv-3.0.0-rc1/modules/objdetect/src/cascadedetect.cpp:1595: error: (-215) !empty() in function detectMultiScale
Tentei pesquisar a resposta aqui, mas o melhor que encontrei é que devo estar carregando o face_cascade do jeito errado ... Alguma ajuda?
python
python-2.7
opencv
image-recognition
Arthurckl
fonte
fonte
Respostas:
O XML ou arquivo está ausente ou o caminho para ele está incorreto ou o caminho create_capture está incorreto.
Os caminhos no exemplo opencv são assim:
cascade_fn = args.get('--cascade', "../../data/haarcascades/haarcascade_frontalface_alt.xml") nested_fn = args.get('--nested-cascade', "../../data/haarcascades/haarcascade_eye.xml") cam = create_capture(video_src, fallback='synth:bg=../data/lena.jpg:noise=0.05')
fonte
Eu tive o mesmo problema.
Não precisei baixar mais nada para resolver isso. CV2 tinha tudo que eu precisava.
Em vez de tentar descobrir onde
.xml
estão os arquivos e codificar os valores, usei uma propriedade fornecida por cv2.De OP
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
Torna-se
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
fonte
Executei o mesmo código. Há duas coisas a serem observadas aqui. 1. Forneça o caminho completo dos arquivos .xml. 2. Dê uma instrução de evento de pressionamento de tecla no final.
Adicione este bloco de código no final e execute seu arquivo, funcionou para mim:
k = cv2.waitKey(0) if k == 27: # wait for ESC key to exit cv2.destroyAllWindows() elif k == ord('s'): # wait for 's' key to save and exit cv2.imwrite('messigray.png',img) cv2.destroyAllWindows()
Por exemplo, meu código parecia
import numpy as np import cv2 face_cascade = cv2.CascadeClassifier('C:\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_default.xml') eye_cascade = cv2.CascadeClassifier('C:\\opencv\\build\\etc\\haarcascades\\haarcascade_eye.xml') img = cv2.imread('lena.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.3, 5) #faces = face_cascade.detectMultiScale(gray) for (x,y,w,h) in faces: cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) roi_gray = gray[y:y+h, x:x+w] roi_color = img[y:y+h, x:x+w] eyes = eye_cascade.detectMultiScale(roi_gray) for (ex,ey,ew,eh) in eyes: cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2) cv2.imshow('img',img) k = cv2.waitKey(0) if k == 27: # wait for ESC key to exit cv2.destroyAllWindows() elif k == ord('s'): # wait for 's' key to save and exit cv2.imwrite('messigray.png',img) cv2.destroyAllWindows()
Minha saída ficou assim:
fonte
Use todo o caminho do arquivo e use "\\" em vez de "\" no caminho do arquivo xml.
O caminho do arquivo deve ser o seguinte:
face_cascade = cv2.CascadeClassifier('C:\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_default.xml')
ao invés de:
cascade_fn = args.get('--cascade', "..\..\data\haarcascades\haarcascade_frontalface_alt.xml")
fonte
O arquivo XML está faltando, você pode obter o arquivo do repositório GitHub e colocá-lo no mesmo diretório do seu projeto. O link para a pasta no GitHub está aqui . Basta baixar o arquivo chamado haarcascade_frontalface_default.xml . Na verdade, o arquivo existe em seu sistema. Basta ir para a pasta site-packages da sua pasta de instalação do python e verificar a pasta cv2 / data para o arquivo
fonte
Se você estiver usando o Anaconda, você deve adicionar o caminho do Anaconda.
new_path = 'C:/Users/.../Anaconda/Library/etc/haarcascades/' face_cascade = cv2.CascadeClassifier(new_path + 'haarcascade_frontalface_default.xml')
fonte
não há necessidade de mudar o código
baixe esse arquivo .xml e coloque o caminho desse arquivo
vai resolver o erro (100%)
fonte
Este erro significa que o arquivo XML não foi encontrado. A biblioteca precisa que você transmita o caminho completo, embora provavelmente você esteja apenas usando um arquivo que veio com a biblioteca OpenCV.
Você pode usar o
pkg_resources
módulo integrado para determinar isso automaticamente para você. O código a seguir pesquisa o caminho completo para um arquivo dentro de onde ocv2
módulo foi carregado:import pkg_resources haar_xml = pkg_resources.resource_filename( 'cv2', 'data/haarcascade_frontalface_default.xml')
Para mim foi
'/Users/andrew/.local/share/virtualenvs/foo-_b9W43ee/lib/python3.7/site-packages/cv2/data/haarcascade_frontalface_default.xml'
; o seu com certeza será diferente. Apenas deixe apkg_resources
biblioteca do python descobrir isso.Sucesso!
fonte
No OSX com um homebrew, instale o caminho completo para a pasta opencv:
face_cascade = cv2.CascadeClassifier('/usr/local/Cellar/opencv/3.4.0_1/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml') eye_cascade = cv2.CascadeClassifier('/usr/local/Cellar/opencv/3.4.0_1/share/OpenCV/haarcascades/haarcascade_eye.xml')
Tome cuidado com o número da versão no caminho.
fonte
Provavelmente, o
face_cascade
está vazio. Você pode verificar se a variável está vazia ou não digitando o seguinte comando:Se estiver vazio, você o obterá
True
e isso significa que seu arquivo não está disponível no caminho que você mencionou. Tente adicionar o caminho completo do arquivo xml da seguinte maneira:r'D:\folder Name\haarcascade_frontalface_default.xml'
fonte
"\ Anaconda3 \ Lib \ site-packages \ cv2 \ data \" Encontrei o arquivo xml neste caminho para o Anaconda
fonte
Você pode encontrar esse tipo de erro quando não definiu o caminho completo do seu arquivo XML. Tente este se você estiver usando opencv3.1.0 no raspberrypi 3: " faceCascade = cv2.CascadeClassifier ('/ home / pi / opencv-3.1.0 / data / haarcascades / haarcascade_frontalface_default.xml ')"
fonte
Você pode resolver esse problema colocando XML no mesmo diretório em que seu arquivo python principal (de onde você tentou incluir este arquivo) foi colocado. Agora, a próxima etapa é usar o caminho completo. Por exemplo
Isso não vai funcionar
front_cascade = cv2.CascadeClassifier('./haarcascade_eye.xml')
Use o caminho completo, agora vai funcionar bem
front_cascade = cv2.CascadeClassifier('/Users/xyz/Documents/project/haarcascade_eye.xml')
fonte
Descobri isso em outra resposta, mas funcionou para mim quando adicionei as duas respostas.
import cv2 from matplotlib import pyplot as plt import numpy as np face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml") eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_eye.xml") img = cv2.imread('image1.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.3, 5)
fonte
Você só precisa adicionar o caminho apropriado para o
haarcascade_frontalface_default.xml
arquivo, ou seja, você só precisa adicionar o prefixo (cv2.data.haarcascades
)face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
fonte
Seu arquivo XML não foi encontrado. Tente usar caminhos absolutos como:
fonte
o erro pode ser devido a, os arquivos xml necessários não foram carregados corretamente. Procure o arquivo
haarcascade_frontalface_default.xml
usando o mecanismo de busca do seu sistema operacional, obtenha o caminho completo e coloque-o como o argumento decv2.CascadeClassifier
como stringfonte
Não copie e cole o conteúdo do arquivo xml, porque assim que colar no bloco de notas, ele será salvo como um arquivo de texto. Portanto, baixe o arquivo diretamente da fonte fornecida.
fonte
Eu tive o mesmo problema. mas escreveu o local correto.
face_cascade = cv2.CascadeClassifier('./model/haarcascade_frontalface_default.xml')
Descobri que preciso declarar o caminho completo para remover o erro.
face_cascade = cv2.CascadeClassifier('C:/pythonScript/Facial-Emotion-Detection/model/haarcascade_frontalface_default.xml')
fonte
Tive o mesmo problema
opencv-python
e usei um ambiente virtual. Se for o seu caso, você deve encontrar osxml
arquivos em:/home/username/virtual_environment/lib/python3.5/site-packages/cv2/data/haarcascade_frontalface_default.xml
/home/username/virtual_environment/lib/python3.5/site-packages/cv2/data/haarcascade_eye.xml
Certifique-se de que está usando o caminho absoluto. Caso contrário, não funcionará.
fonte
A ideia principal da solução conforme mencionada acima: encontrar o caminho correto do
.xml
arquivo e utilizá-lo para acessar o arquivo corretamente.No meu caso, instalei o opencv no env anoconda, primeiro direto para o path da Anoconda, depois
encontre o caminho do
.xml
arquivo usando:$ find . -name 'haarcascade_eye.xml'
(por exemplo, pesquise ohaarcascade_eye.xml
arquivo no diretório atual (.))Em seguida, use o retorno
path
:eye_cascade = cv2.CascadeClassifier(path + 'haarcascade_eye.xml')
fonte
O erro ocorre devido à falta de arquivos xml ou caminho incorreto do arquivo xml.
Tente o seguinte código,
import numpy as np import cv2 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml') cap = cv2.VideoCapture(0) while 1: ret, img = cap.read() gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.3, 5) for (x,y,w,h) in faces: cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) roi_gray = gray[y:y+h, x:x+w] roi_color = img[y:y+h, x:x+w] eyes = eye_cascade.detectMultiScale(roi_gray) for (ex,ey,ew,eh) in eyes: cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2) cv2.imshow('img',img) k = cv2.waitKey(30) & 0xff if k == 27: break cap.release() cv2.destroyAllWindows()
fonte