error: (-215)! empty () dedektörde algılayıcı


97

Python 2.7'de cv2 öğrenmeye çalışıyorum, ancak kodumu çalıştırdığımda, belirli bir kısmında:

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)

şunu döndürür:

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

Cevabı burada aramaya çalıştım ama bulabildiğim en iyi şey, face_cascade'i yanlış şekilde yüklemem gerektiğidir ... Herhangi bir yardım?


28
xml dosyanız bulunamadı. "/my/files/bla/cacade.xml" gibi mutlak bir yol deneyin
Berak

@berak Önerdiğiniz yolun orijinal yolunu değiştirdim ancak kod aynı hatayı döndürüyor
arthurckl

Görüntünüzün boş olmadığını (örneğin doğru yüklenmemişse) bir test veya görüntülenen görüntü ekleyerek doğrulayabilir misiniz?
Micka

2
Oh anladım, dosya yolunu yanlış yazdım. Yardım için teşekkürler !
arthurckl

1
Aynı sorunum var ve ne kadar denersem deneyeyim çözemedim. Nasıl çözdüğünüzü bize anlatır mısınız? @arthurckl
aysebilgegunduz

Yanıtlar:


65

XML veya dosya eksik veya yolu yanlış veya create_capture yolu yanlış.

Opencv örneğindeki yollar şuna benzer:

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

59

Ben de aynı sorunu yaşadım.

Bunu çözmek için başka bir şey indirmeme gerek yoktu. CV2 ihtiyacım olan her şeye sahipti.

.xmlDosyaların nerede olduğunu anlamaya çalışmak ve değerleri zor kodlamak yerine, cv2 tarafından verilen bir özelliği kullandım.

OP'den

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

Olur

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

9
Bu doğru cevap olarak işaretlenmeli, bana zaman kazandırırdı.
Joe Albowicz

4
Bu mükemmel çalıştı, bu doğru işaretlenmelidir
Seaver Olson

@VIVID'de hangi hatayı aldınız? Cv2.data.haarcascades ile mi yoksa cv2.CascadeClassifie ile mi?
Mandelbrotter

@Mandelbrotter İşte benim sorunum: stackoverflow.com/questions/63423843/…
VIVID

17

Aynı kodu çalıştırdım. Burada dikkat edilmesi gereken iki nokta var. 1. .xml dosyalarının tam yolunu verin. 2. Sonunda bir tuşa basma olay talimatı verin.

Bu kod bloğunu sonuna ekleyin ve dosyanızı çalıştırın, benim için çalıştı:

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

Örneğin, kodum şöyle görünüyordu

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

Çıktım şöyle görünüyordu:

çıktı


benim için mutlak yol yanlıştı CWD (C: Drive / projectdirectory /) yani 'C: / Flask / venv / Lib / site-packages / cv2 / data /'
ThomasLYIT

11

Tüm dosya yolunu kullanın ve xml dosya yolunda "\" yerine "\\" kullanın.

Dosya yolu aşağıdaki gibi olmalıdır:

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

onun yerine:

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

11

XML dosyası eksik, dosyayı GitHub deposundan alabilir ve projenizle aynı dizine yerleştirebilirsiniz. GitHub'daki klasöre bağlantı burada . Haarcascade_frontalface_default.xml adlı dosyayı indirmeniz yeterlidir . Aslında dosya sisteminizde var. Python kurulum klasörünüzün site paketleri klasörüne gidin ve dosya için cv2 / data klasörünü kontrol edin.


8

Anaconda kullanıyorsanız Anaconda yolunu eklemelisiniz.

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

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

8

kodu değiştirmeye gerek yok

o .xml dosyasını indirin, ardından o dosyanın yolunu girin

hatayı çözecek (% 100)


5

Bu hata, XML dosyasının bulunamadığı anlamına gelir. Muhtemelen sadece OpenCV kitaplığıyla birlikte gelen bir dosyayı kullanıyor olsanız bile, kitaplığın tam yolu geçmeniz gerekir.

Bunu sizin için otomatik olarak belirlemek için yerleşik pkg_resourcesmodülü kullanabilirsiniz. Aşağıdaki kod, cv2modülün yüklendiği yerin içindeki bir dosyanın tam yolunu arar :

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

Benim için bu '/Users/andrew/.local/share/virtualenvs/foo-_b9W43ee/lib/python3.7/site-packages/cv2/data/haarcascade_frontalface_default.xml'; seninkinin farklı olması garantilidir. Sadece python'un pkg_resourceskütüphanesi çözsün.

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

Başarılı!


4

Bir homebrew ile OSX'te, opencv klasörünün tam yolunu kurun:

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

Yoldaki sürüm numarasına dikkat edin.


3

Muhtemelen face_cascadeboştur. Aşağıdaki komutu yazarak değişkenin boş olup olmadığını kontrol edebilirsiniz:

face_cascade.empty()

Boşsa alacaksınız Trueve bu, dosyanızın bahsettiğiniz yolda bulunmadığı anlamına gelir. Aşağıdaki gibi xml dosyasının tam yolunu eklemeyi deneyin:

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

3

"\ Anaconda3 \ Lib \ site-packages \ cv2 \ data \" Anaconda için bu yolda xml dosyasını buldum


3

haarcascade_frontalface_default.xmlDosyanın doğru yolunu eklemeniz yeterlidir, yani yalnızca önek ( cv2.data.haarcascades) eklemeniz gerekir.

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

2

XML dosyanızın tam yolunu tanımlamadığınızda bu tür hatalar bulabilirsiniz. Raspberrypi 3'te opencv3.1.0 kullanıyorsanız şunu deneyin: " faceCascade = cv2.CascadeClassifier ('/ home / pi / opencv-3.1.0 / data / haarcascades / haarcascade_frontalface_default.xml ')"


2

Bu sorunu, XML'i ana python dosyanızın (bu dosyayı eklemeye çalıştığınız yerden) yerleştirdiği dizine yerleştirerek çözebilirsiniz . Şimdi bir sonraki adım tam yolu kullanmaktır. Örneğin

Bu işe yaramayacak

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

Tam yolu kullan, şimdi iyi çalışacak

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

2

Bunu başka bir cevapta buldum ama sonunda iki cevabı eklediğimde benim için çalıştı.

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)

1

XML dosyanız bulunamadı. Aşağıdakiler gibi mutlak yolları kullanmayı deneyin:

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

1

hata gerekli xml dosyalarının düzgün yüklenmemiş olmasından kaynaklanıyor olabilir. haarcascade_frontalface_default.xml İşletim sisteminizin arama motorunu kullanarak dosyayı arayın, tam yolu alın ve cv2.CascadeClassifierdizge olarak argüman olarak koyun


1

Lütfen xml dosyasının içeriğini kopyalayıp yapıştırmayın, çünkü not defterine yapıştırdığınızda metin dosyası olarak kaydedilecektir. Bu nedenle, dosyayı verilen kaynaktan doğrudan indirin.


1

Ben de aynı problemle karşılaştım. ama doğru yeri yazdı.

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

Hatayı gidermek için tam yolu bildirmem gerektiğini anladım.

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

Sorunumu çözdüm! Bunu stackoverflow.com/a/3430395/3525780 ile birleştirin ve her zaman geçerli çalışma dizinini alın
Fusseldieb

0

Aynı sorunu opencv-pythonyaşadım ve sanal bir ortam kullandım. Sizin durumunuzsa, xmldosyaları şu adreste bulmalısınız :

/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

Lütfen mutlak yolu kullandığınızdan emin olun. Aksi takdirde işe yaramaz.


0

Çözümün ana fikri yukarıda belirtildiği gibi: doğru yolu bulun .xml dosyanın bulun ve dosyaya doğru bir şekilde erişmek için onu kullanın.

Benim durumumda, opencv'yi anoconda env'e kurdum, önce doğrudan Anoconda yoluna, sonra

  • şunu .xmlkullanarak dosyanın yolunu bulun :

    $ find . -name 'haarcascade_eye.xml' (örneğin haarcascade_eye.xml, geçerli dizindeki (.) dosyayı arayın )

  • Sonra dönüşü kullanın path:

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


0

Benzer bir sorunla karşılaştım. Görünüşe göre XML yolunu düzeltmek bu hatayı ortadan kaldırıyor.


SO'ya hoş geldiniz. Cevabınız için teşekkür etsek de, diğer cevapların üzerine ek bir değer katması daha iyi olur. Bu durumda, yanıtınız ek bir değer sağlamaz, çünkü XML'e giden yolu değiştirerek bahsettiğimiz birçok yanıt vardır.
Doj

-1

Hata, xml dosyalarının eksik olması veya xml dosyasının yanlış yolu nedeniyle oluşur.

Lütfen aşağıdaki kodu deneyin,

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()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.