2015-05-28 13 views
21

Próbuję nauczyć CV2 w Pythonie 2.7, ale gdy uruchomię mój kod, w określonej części go:błąd: (-215) empty() w funkcji detectMultiScale

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) 

powraca 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 szukać odpowiedzi tutaj, ale najlepiej mogę znaleźć jest to, że musi być załadowaniu face_cascade wspak ... Każda pomoc?

+4

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

+0

@berak I zastąpił oryginalną ścieżkę do tej, którą zasugerowałeś, ale kod zwraca ten sam błąd – arthurckl

+0

możesz sprawdzić, czy obraz nie jest pusty (np. jeśli nie ładowane poprawnie) przez dodanie testu lub wyświetlania obrazu? – Micka

Odpowiedz

21

Brak pliku XML lub pliku lub ścieżka do niego jest niepoprawna lub ścieżka create_capture jest niepoprawna.

Ścieżki w wyglądzie próbki OpenCV tak:

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

Pobiegłem ten sam kod. Należy zwrócić uwagę na dwie rzeczy. 1. Podaj całą ścieżkę plików .xml. 2. Podaj instrukcję zakończenia naciśnięcia klawisza na końcu.

Dodaj ten fragment kodu na końcu i uruchom plik, pracował 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ło

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

moje wyjście wyglądało enter image description here

5

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

ścieżka Plik powinien być następujący:

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") 
+0

dzięki, to działa dla mnie – Statham

5

Jeśli używasz Anaconda należy dodać ścieżkę Anaconda.

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

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

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

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

Możesz znaleźć tego rodzaju błędy, gdy nie zdefiniowałeś pełnej ścieżki do pliku XML. Spróbuj tego jeśli używasz opencv3.1.0 w Raspberry Pi 3: "faceCascade = cv2.CascadeClassifier ('/ home/pi/opencv3.1.0/data/haarcascades/haarcascade_frontalface_default.xml')"

1

Prawdopodobnie face_cascade jest pusty. Można sprawdzić, czy zmienna jest pusta lub nie przez pisanie następujące polecenia:

face_cascade.empty() 

Jeśli jest pusty dostaniesz True a to oznacza, że ​​plik nie jest dostępny w ścieżce pan wspomniał. Spróbuj dodać pełną ścieżkę pliku xml następująco:

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

na OSX z homebrew zainstalować pełną ścieżkę do folderu OpenCV powinno 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 numerze wersji w ścieżka.