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?
python
python-2.7
opencv
image-recognition
arthurckl
źródło
źródło
Odpowiedzi:
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')
źródło
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
.xml
są 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')
źródło
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:
źródło
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")
źródło
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
źródło
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')
źródło
nie ma potrzeby zmiany kodu
pobierz ten plik .xml, a następnie umieść ścieżkę do tego pliku
rozwiąże błąd (100%)
źródło
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_resources
modułu, aby automatycznie określić to za Ciebie. Poniższy kod wyszukuje pełną ścieżkę do pliku w miejscu, z któregocv2
moduł 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ólpkg_resources
bibliotece Pythona to zrozumieć.Sukces!
źródło
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.
źródło
Prawdopodobnie
face_cascade
jest pusty. Możesz sprawdzić, czy zmienna jest pusta, czy nie, wpisując następujące polecenie:Jeśli jest pusty, otrzymasz,
True
co 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'
źródło
„\ Anaconda3 \ Lib \ site-packages \ cv2 \ data \” W tej ścieżce znalazłem plik xml dla Anacondy
źródło
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 ')"
źródło
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')
źródło
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)
źródło
Wystarczy dodać odpowiednią ścieżkę do
haarcascade_frontalface_default.xml
pliku 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')
źródło
Twój plik XML nie został znaleziony. Spróbuj użyć ścieżek bezwzględnych, takich jak:
źródło
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 argumentcv2.CascadeClassifier
jako ciągźródło
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.
źródło
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')
źródło
Miałem ten sam problem
opencv-python
i korzystałem ze środowiska wirtualnego. Jeśli tak jest, powinieneś znaleźćxml
pliki 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.
źródło
Główna idea rozwiązania, jak wspomniano powyżej: znajdź właściwą ścieżkę do
.xml
pliku 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 wyszukajhaarcascade_eye.xml
plik w bieżącym katalogu (.))Następnie użyj zwrotu
path
:eye_cascade = cv2.CascadeClassifier(path + 'haarcascade_eye.xml')
źródło
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()
źródło