erro: (-215)! empty () na função detectMultiScale

88

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?

Arthurckl
fonte
28
seu arquivo xml não foi encontrado. tente um caminho absoluto como "/my/files/bla/cacade.xml"
berak
@berak Substituí o caminho original pelo que você sugeriu, mas o código retorna o mesmo erro
arthurckl
você pode verificar se sua imagem não está vazia (por exemplo, se não carregada corretamente) adicionando um teste ou exibição de imagem?
Micka
2
Ah entendi, escrevi o caminho de fila do jeito errado. Obrigado pela ajuda !
arthurckl
1
Eu tenho o mesmo problema e não importa o quanto eu tentei, não consegui resolvê-lo. Você pode nos contar como você resolveu? @arthurckl
aysebilgegunduz

Respostas:

61

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')
Pessoa
fonte
44

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 .xmlestã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')
Mandelbrotter
fonte
6
Isso deveria ser marcado como resposta correta, teria me economizado tempo.
Joe Albowicz
2
Funcionou perfeitamente e deve ser marcado como correto
Seaver Olson
Que erro você obteve @VIVID? Foi com cv2.data.haarcascades ou com cv2.CascadeClassifie?
Mandelbrotter
@Mandelbrotter Aqui está o meu problema: stackoverflow.com/questions/63423843/…
VIVID
16

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:

saída

Keerthana Gopalakrishnan
fonte
o caminho absoluto para mim estava errado teve que incluir CWD (C: Drive / projectdirectory /), ou seja, 'C: / Flask / venv / Lib / site-packages / cv2 / data /'
ThomasLYIT
11

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")
Anubhav
fonte
11

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

Avneesh Mishra
fonte
8

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')
Ale
fonte
8

não há necessidade de mudar o código

baixe esse arquivo .xml e coloque o caminho desse arquivo

vai resolver o erro (100%)

Coder
fonte
5

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_resourcesmódulo integrado para determinar isso automaticamente para você. O código a seguir pesquisa o caminho completo para um arquivo dentro de onde o cv2mó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 a pkg_resourcesbiblioteca do python descobrir isso.

classifier = cv2.CascadeClassifier(haar_xml)
faces = classifier.detectMultiScale(frame)

Sucesso!

andrewdotn
fonte
4

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.

Mestre abelha
fonte
3

Provavelmente, o face_cascadeestá vazio. Você pode verificar se a variável está vazia ou não digitando o seguinte comando:

face_cascade.empty()

Se estiver vazio, você o obterá Truee 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'
Vaibhav K
fonte
3

"\ Anaconda3 \ Lib \ site-packages \ cv2 \ data \" Encontrei o arquivo xml neste caminho para o Anaconda

My3
fonte
2

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 ')"

Sahil Sharma
fonte
2

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')
am2505
fonte
2

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)
Dipak
fonte
2

Você só precisa adicionar o caminho apropriado para o haarcascade_frontalface_default.xmlarquivo, 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')
MashukKhan
fonte
1
Essa abordagem também funcionou para mim
Maf
1

Seu arquivo XML não foi encontrado. Tente usar caminhos absolutos como:

/path/to/my/file (Mac, Linux)
C:\\path\\to\\my\\file (Windows)
Clyde McQueen
fonte
1

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 de cv2.CascadeClassifiercomo string

Niharranjan Pradhan
fonte
1

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.

Nagesh Singh Chauhan
fonte
1

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')
kiLLua
fonte
Resolveu meu problema! Combine isso com stackoverflow.com/a/3430395/3525780 e obtenha sempre o diretório de trabalho atual
Fusseldieb
0

Tive o mesmo problema opencv-pythone usei um ambiente virtual. Se for o seu caso, você deve encontrar os xmlarquivos 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á.

Lenhhoxung
fonte
0

A ideia principal da solução conforme mencionada acima: encontrar o caminho correto do .xmlarquivo 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 .xmlarquivo usando:

    $ find . -name 'haarcascade_eye.xml' (por exemplo, pesquise o haarcascade_eye.xmlarquivo no diretório atual (.))

  • Em seguida, use o retorno path:

eye_cascade = cv2.CascadeClassifier(path + 'haarcascade_eye.xml')

Xiaoyan Zhuo
fonte
-1

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