kesalahan: (-215)! empty () di fungsi detectMultiScale

97

Saya mencoba mempelajari cv2 dengan python 2.7, tetapi ketika saya menjalankan kode saya, di bagian spesifiknya:

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)

ini mengembalikan ini:

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

Saya mencoba mencari jawabannya di sini tetapi yang terbaik yang dapat saya temukan adalah bahwa saya harus memuat face_cascade dengan cara yang salah ... Ada bantuan?

arthurckl
sumber
28
file xml Anda tidak ditemukan. coba jalur absolut seperti "/my/files/bla/cacade.xml"
berak
@berak Saya mengganti jalur asli untuk yang Anda sarankan tetapi kode mengembalikan kesalahan yang sama
arthurckl
dapatkah Anda memverifikasi bahwa gambar Anda tidak kosong (mis. jika tidak dimuat dengan benar) dengan menambahkan tes atau gambar yang ditampilkan?
Micka
2
Oh saya mengerti, saya menulis jalur fila dengan cara yang salah. Terima kasih untuk bantuannya !
arthurckl
1
Saya memiliki masalah yang sama dan tidak peduli seberapa keras saya mencoba, saya tidak dapat menyelesaikannya. Bisakah Anda memberi tahu kami bagaimana Anda menyelesaikannya? @arthurckl
aysebilgegunduz

Jawaban:

65

XML atau file hilang atau jalur ke sana salah atau jalur create_capture salah.

Path dalam contoh opencv terlihat seperti ini:

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')
Orang
sumber
59

Saya memiliki masalah yang sama.

Saya tidak perlu mengunduh apa pun untuk menyelesaikan ini. CV2 memiliki semua yang saya butuhkan.

Alih-alih mencoba mencari tahu di mana .xmlfile-file tersebut dan hard coding nilainya, saya menggunakan properti yang diberikan oleh cv2.

Dari OP

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

Menjadi

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
Mandelbrotter
sumber
9
Ini harus ditandai sebagai jawaban yang benar, akan menghemat waktu saya.
Joe Albowicz
4
Ini bekerja dengan sempurna ini harus ditandai benar
Seaver Olson
Kesalahan apa yang Anda dapatkan @VIVID? Apakah dengan cv2.data.haarcascades atau dengan cv2.CascadeClassifie?
Mandelbrotter
@Mandelbrotter Inilah masalah saya: stackoverflow.com/questions/63423843/…
VIVID
17

Saya menjalankan kode yang sama. Ada dua hal yang perlu diperhatikan di sini. 1. Berikan seluruh jalur file .xml. 2. Berikan instruksi acara penekanan tombol di akhir.

Tambahkan blok kode ini di akhir dan jalankan file Anda, berhasil untuk saya:

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

Misalnya, kode saya terlihat seperti

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

Output saya terlihat seperti ini:

ouput

Keerthana Gopalakrishnan
sumber
jalur absolut bagi saya salah harus menyertakan CWD (C: Drive / projectdirectory /) yaitu 'C: / Flask / venv / Lib / site-packages / cv2 / data /'
ThomasLYIT
11

Gunakan seluruh jalur file dan gunakan "\\" sebagai ganti "\" di jalur file xml.

Jalur file harus seperti berikut:

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

dari pada:

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

File XML tidak ada, Anda bisa mendapatkan file dari repositori GitHub dan meletakkannya di direktori yang sama dengan proyek Anda. Tautan ke folder di GitHub ada di sini . Unduh saja file bernama haarcascade_frontalface_default.xml . Sebenarnya, file tersebut ada di sistem Anda. Cukup buka folder paket situs dari folder instalasi python Anda dan periksa folder cv2 / data untuk file tersebut

avneesh mishra
sumber
8

Jika Anda menggunakan anaconda, Anda harus menambahkan jalur anaconda.

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

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

tidak perlu mengubah kode

unduh file .xml itu, lalu letakkan jalur file itu

itu akan menyelesaikan kesalahan (100%)

Pembuat kode
sumber
5

Kesalahan ini berarti file XML tidak dapat ditemukan. Pustaka membutuhkan Anda untuk meneruskannya ke jalur lengkap, meskipun Anda mungkin hanya menggunakan file yang disertakan dengan pustaka OpenCV.

Anda dapat menggunakan pkg_resourcesmodul bawaan untuk menentukan ini secara otomatis untuk Anda. Kode berikut mencari jalur lengkap ke file di dalam tempat cv2modul dimuat:

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

Bagi saya ini adalah '/Users/andrew/.local/share/virtualenvs/foo-_b9W43ee/lib/python3.7/site-packages/cv2/data/haarcascade_frontalface_default.xml'; milikmu dijamin berbeda. Biarkan saja pkg_resourcesperpustakaan python yang mengetahuinya.

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

Keberhasilan!

andrewdotn
sumber
4

Di OSX dengan homebrew, instal path lengkap ke folder opencv seharusnya berfungsi:

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

Jaga nomor versi di jalur.

Master Bee
sumber
3

Mungkin face_cascadekosong. Anda dapat memeriksa apakah variabel kosong atau tidak dengan mengetik perintah berikut:

face_cascade.empty()

Jika kosong Anda akan mendapatkan Truedan ini berarti file Anda tidak tersedia di jalur yang Anda sebutkan. Coba tambahkan path lengkap file xml sebagai berikut:

r'D:\folder Name\haarcascade_frontalface_default.xml'
Vaibhav K
sumber
3

"\ Anaconda3 \ Lib \ site-packages \ cv2 \ data \" Saya menemukan file xml di jalur ini untuk Anaconda

My3
sumber
3

Anda hanya perlu menambahkan jalur yang tepat dari haarcascade_frontalface_default.xmlfile tersebut, yaitu Anda hanya perlu menambahkan prefiks ( 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
sumber
2

Anda mungkin menemukan jenis kesalahan seperti itu ketika Anda tidak menentukan jalur lengkap file XML Anda. Coba yang ini jika Anda menggunakan opencv3.1.0 di raspberrypi 3: " faceCascade = cv2.CascadeClassifier ('/ home / pi / opencv-3.1.0 / data / haarcascades / haarcascade_frontalface_default.xml ')"

Sahil Sharma
sumber
2

Anda dapat mengatasi masalah ini dengan menempatkan XML di direktori yang sama dengan file python utama Anda (dari mana Anda mencoba memasukkan file ini) ditempatkan. Sekarang langkah selanjutnya adalah menggunakan jalur lengkap. Sebagai contoh

Ini tidak akan berhasil

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

Gunakan jalur lengkap, sekarang akan berfungsi dengan baik

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

Saya menemukan ini di beberapa jawaban lain tetapi akhirnya berhasil untuk saya ketika saya menambahkan dua jawaban.

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
sumber
1

File XML Anda tidak ditemukan. Coba gunakan jalur absolut seperti:

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

kesalahan tersebut mungkin karena, file xml yang dibutuhkan belum dimuat dengan benar. Cari file haarcascade_frontalface_default.xml dengan menggunakan mesin pencari OS ur mendapatkan path lengkap dan meletakkannya sebagai argumen cv2.CascadeClassifiersebagai string

Niharranjan Pradhan
sumber
1

Harap jangan menyalin dan menempel konten file xml, karena setelah Anda menempelkannya ke notepad, itu akan disimpan sebagai file teks. Jadi langsung unduh file dari sumber yang diberikan.

Nagesh Singh Chauhan
sumber
1

Saya mengalami masalah yang sama. tapi lokasi yg benar aja.

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

Saya menemukan bahwa saya perlu mendeklarasikan path lengkap untuk menghilangkan kesalahan.

face_cascade = cv2.CascadeClassifier('C:/pythonScript/Facial-Emotion-Detection/model/haarcascade_frontalface_default.xml')
kiLLua
sumber
Memecahkan masalah saya! Gabungkan itu dengan stackoverflow.com/a/3430395/3525780 dan selalu dapatkan direktori kerja saat ini
Fusseldieb
0

Saya memiliki masalah yang sama dengan opencv-pythondan saya menggunakan lingkungan virtual. Jika itu kasus Anda, Anda harus menemukan xmlfile di:

/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

Harap pastikan bahwa Anda menggunakan jalur absolut. Jika tidak, itu tidak akan berhasil.

lenhhoxung
sumber
0

Ide utama dari solusi seperti yang disebutkan di atas: temukan jalur yang benar dari .xmlfile dan gunakan untuk mengakses file dengan benar.

Dalam kasus saya, saya menginstal opencv di anoconda env, pertama langsung ke jalur Anoconda, lalu

  • temukan jalur .xmlfile dengan menggunakan:

    $ find . -name 'haarcascade_eye.xml' (misalnya mencari haarcascade_eye.xmlfile di direktori saat ini (.))

  • Kemudian gunakan pengembalian path:

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

Xiaoyan Zhuo
sumber
0

Saya menghadapi masalah serupa. Tampaknya mengoreksi jalur ke XML membuat kesalahan ini hilang.

Sagar Singh
sumber
Selamat datang di SO. Meskipun kami berterima kasih atas jawaban Anda, akan lebih baik jika memberikan nilai tambahan di atas jawaban lainnya. Dalam kasus ini, jawaban Anda tidak memberikan nilai tambahan, karena ada banyak jawaban yang telah disebutkan, mengubah jalur ke XML.
Doj
-1

Kesalahan terjadi karena file xml tidak ada atau path file xml tidak benar.

Silakan coba kode berikut,

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()
Pembuat kode
sumber