błąd: (-215)! empty () w funkcji detekcjaMultiScale


88

Próbuję nauczyć się cv2 w Pythonie 2.7, ale kiedy uruchamiam mój kod, w określonej jego części:

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)

zwraca to:

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

Próbowałem tu znaleźć odpowiedź, ale najlepsze, co znalazłem, to to, że muszę ładować face_cascade w niewłaściwy sposób ... Jakaś pomoc?


28
Twój plik xml nie został znaleziony. wypróbuj ścieżkę bezwzględną, taką jak „/my/files/bla/cacade.xml”
berak

@berak Zastąpiłem oryginalną ścieżkę na tę, którą zasugerowałeś, ale kod zwraca ten sam błąd
arthurckl

czy możesz sprawdzić, czy obraz nie jest pusty (np. jeśli nie został poprawnie załadowany), dodając test lub wyświetlanie obrazu?
Micka

2
Och, rozumiem, źle napisałem ścieżkę fila. Dzięki za pomoc !
arthurckl

1
Mam ten sam problem i bez względu na to, jak bardzo się starałem, nie mogłem go rozwiązać. Czy możesz nam powiedzieć, jak rozwiązałeś? @arthurckl
aysebilgegunduz

Odpowiedzi:


61

Brakuje pliku XML lub pliku, ścieżka do niego jest nieprawidłowa lub ścieżka create_capture jest nieprawidłowa.

Ścieżki w próbce opencv wyglądają następująco:

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

44

Miałem ten sam problem.

Nie musiałem pobierać niczego więcej, aby rozwiązać ten problem. CV2 miał wszystko, czego potrzebowałem.

Zamiast próbować dowiedzieć się, gdzie .xmlsą pliki i zakodować na stałe wartości, użyłem właściwości podanej przez cv2.

Z OP

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

Staje się

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')

6
To powinno być oznaczone jako poprawna odpowiedź, zaoszczędziłoby mi to czas.
Joe Albowicz

2
To działało idealnie, powinno to być oznaczone jako poprawne
Seaver Olson

Jaki błąd dostałeś @VIVID? Czy było to z cv2.data.haarcascades czy z cv2.CascadeClassifie?
Mandelbrotter

@Mandelbrotter Oto mój problem: stackoverflow.com/questions/63423843/ ...
VIVID

16

Uruchomiłem ten sam kod. Należy zwrócić uwagę na dwie rzeczy. 1. Podaj pełną ścieżkę do plików .xml. 2. Na koniec podaj instrukcję dotyczącą zdarzenia naciśnięcia klawisza.

Dodaj ten blok kodu na końcu i uruchom plik, działał dla mnie:

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

Na przykład mój kod wyglądał jak

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

Mój wynik wyglądał następująco:

ouput


ścieżka absolutna była dla mnie błędna, musiała zawierać CWD (C: Drive / projectdirectory /), tj. 'C: / Flask / venv / Lib / site-packages / cv2 / data /'
ThomasLYIT

11

Użyj całej ścieżki do pliku i użyj znaku „\\” zamiast „\” w ścieżce do pliku xml.

Ścieżka do pliku powinna wyglądać następująco:

face_cascade = cv2.CascadeClassifier('C:\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_default.xml')

zamiast:

cascade_fn = args.get('--cascade', "..\..\data\haarcascades\haarcascade_frontalface_alt.xml")

11

Brak pliku XML, możesz pobrać plik z repozytorium GitHub i umieścić go w tym samym katalogu, co projekt. Link do folderu na GitHub jest tutaj . Wystarczy pobrać plik o nazwie haarcascade_frontalface_default.xml . W rzeczywistości plik istnieje w twoim systemie. Po prostu przejdź do pakietów witryn folderu folderze instalacyjnym Pythona i sprawdź folder cv2 / data dla pliku


8

Jeśli używasz Anacondy, powinieneś dodać ścieżkę Anaconda.

new_path = 'C:/Users/.../Anaconda/Library/etc/haarcascades/'

face_cascade = cv2.CascadeClassifier(new_path + 'haarcascade_frontalface_default.xml')

8

nie ma potrzeby zmiany kodu

pobierz ten plik .xml, a następnie umieść ścieżkę do tego pliku

rozwiąże błąd (100%)


5

Ten błąd oznacza, że ​​nie można znaleźć pliku XML. Biblioteka wymaga podania pełnej ścieżki, nawet jeśli prawdopodobnie używasz tylko pliku dostarczonego z biblioteką OpenCV.

Możesz użyć wbudowanego pkg_resourcesmodułu, aby automatycznie określić to za Ciebie. Poniższy kod wyszukuje pełną ścieżkę do pliku w miejscu, z którego cv2moduł został załadowany:

import pkg_resources
haar_xml = pkg_resources.resource_filename(
    'cv2', 'data/haarcascade_frontalface_default.xml')

Dla mnie to było '/Users/andrew/.local/share/virtualenvs/foo-_b9W43ee/lib/python3.7/site-packages/cv2/data/haarcascade_frontalface_default.xml'; Twój na pewno będzie inny. Po prostu pozwól pkg_resourcesbibliotece Pythona to zrozumieć.

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

Sukces!


4

Na OSX z homebrew zainstaluj pełną ścieżkę do folderu opencv powinna działać:

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

Zadbaj o numer wersji w ścieżce.


3

Prawdopodobnie face_cascadejest pusty. Możesz sprawdzić, czy zmienna jest pusta, czy nie, wpisując następujące polecenie:

face_cascade.empty()

Jeśli jest pusty, otrzymasz, Trueco oznacza, że ​​plik nie jest dostępny we wspomnianej ścieżce. Spróbuj dodać pełną ścieżkę do pliku xml w następujący sposób:

r'D:\folder Name\haarcascade_frontalface_default.xml'

3

„\ Anaconda3 \ Lib \ site-packages \ cv2 \ data \” W tej ścieżce znalazłem plik xml dla Anacondy


2

Tego rodzaju błędy mogą się pojawić, gdy nie zdefiniowałeś pełnej ścieżki do pliku XML. Wypróbuj ten, jeśli używasz opencv3.1.0 w raspberrypi 3: " faceCascade = cv2.CascadeClassifier ('/ home / pi / opencv-3.1.0 / data / haarcascades / haarcascade_frontalface_default.xml ')"


2

Możesz rozwiązać ten problem, umieszczając XML w tym samym katalogu, w którym znajduje się twój główny plik Pythona został umieszczony (z którego próbowałeś dołączyć ten plik). Teraz następnym krokiem jest użycie pełnej ścieżki. Na przykład

To nie zadziała

front_cascade = cv2.CascadeClassifier('./haarcascade_eye.xml')

Użyj pełnej ścieżki, teraz będzie działać dobrze

front_cascade = cv2.CascadeClassifier('/Users/xyz/Documents/project/haarcascade_eye.xml')

2

Znalazłem to w innej odpowiedzi, ale w końcu zadziałało, gdy dodałem dwie odpowiedzi.

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)

2

Wystarczy dodać odpowiednią ścieżkę do haarcascade_frontalface_default.xmlpliku czyli wystarczy dodać prefix ( cv2.data.haarcascades)

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')

1
To podejście zadziałało również u mnie
Maf

1

Twój plik XML nie został znaleziony. Spróbuj użyć ścieżek bezwzględnych, takich jak:

/path/to/my/file (Mac, Linux)
C:\\path\\to\\my\\file (Windows)

1

błąd może wynikać z tego, że wymagane pliki xml nie zostały poprawnie załadowane. Wyszukaj plik haarcascade_frontalface_default.xml za pomocą wyszukiwarki ur OS, pobierz pełną ścieżkę i umieść ją jako argument cv2.CascadeClassifierjako ciąg


1

Prosimy nie kopiować wklejać zawartości pliku xml, ponieważ po wklejeniu go do notatnika zostanie zapisany jako plik tekstowy. Więc bezpośrednio pobierz plik z podanego źródła.


1

Napotkałem ten sam problem. ale napisał poprawną lokalizację.

face_cascade = cv2.CascadeClassifier('./model/haarcascade_frontalface_default.xml')

Dowiedziałem się, że muszę zadeklarować pełną ścieżkę, aby usunąć błąd.

face_cascade = cv2.CascadeClassifier('C:/pythonScript/Facial-Emotion-Detection/model/haarcascade_frontalface_default.xml')

Rozwiązał mój problem! Połącz to ze stackoverflow.com/a/3430395/3525780 i zawsze pobieraj aktualny katalog roboczy
Fusseldieb

0

Miałem ten sam problem opencv-pythoni korzystałem ze środowiska wirtualnego. Jeśli tak jest, powinieneś znaleźć xmlpliki pod adresem:

/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

Upewnij się, że używasz ścieżki bezwzględnej. W przeciwnym razie to nie zadziała.


0

Główna idea rozwiązania, jak wspomniano powyżej: znajdź właściwą ścieżkę do .xmlpliku i użyj jej, aby uzyskać poprawny dostęp do pliku.

W moim przypadku zainstalowałem opencv w anoconda env, najpierw bezpośrednio na ścieżkę Anoconda

  • znaleźć ścieżkę .xml pliku za pomocą:

    $ find . -name 'haarcascade_eye.xml' (na przykład wyszukaj haarcascade_eye.xmlplik w bieżącym katalogu (.))

  • Następnie użyj zwrotu path:

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


-1

Błąd występuje z powodu braku plików xml lub nieprawidłowej ścieżki do pliku xml.

Spróbuj poniższego kodu,

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()
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.