ข้อผิดพลาด: (-215)! empty () ในฟังก์ชัน detectMultiScale


97

ฉันพยายามเรียนรู้ cv2 ใน python 2.7 แต่เมื่อฉันเรียกใช้โค้ดในส่วนเฉพาะของมัน:

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)

มันส่งคืนสิ่งนี้:

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

ฉันพยายามค้นหาคำตอบที่นี่ แต่สิ่งที่ดีที่สุดที่ฉันจะพบคือฉันต้องโหลด face_cascade ผิดวิธี ... มีความช่วยเหลือไหม


28
ไม่พบไฟล์ xml ของคุณ ลองใช้เส้นทางสัมบูรณ์เช่น "/my/files/bla/cacade.xml"
berak

@berak ฉันแทนที่เส้นทางเดิมสำหรับเส้นทางที่คุณแนะนำ แต่รหัสส่งกลับข้อผิดพลาดเดียวกัน
arthurckl

คุณสามารถตรวจสอบได้หรือไม่ว่ารูปภาพของคุณไม่ว่างเปล่า (เช่นหากโหลดไม่ถูกต้อง) โดยเพิ่มการทดสอบหรือการแสดงภาพ
มิกก้า

2
ฉันเข้าใจแล้วฉันเขียนเส้นทาง Fila ผิดทาง ขอบคุณสำหรับความช่วยเหลือ!
arthurckl

1
ฉันมีปัญหาเดียวกันและไม่ว่าฉันจะพยายามแค่ไหนก็ไม่สามารถแก้ไขได้ คุณช่วยบอกเราได้ไหมว่าคุณแก้ไขอย่างไร @arthurckl
aysebilgegunduz

คำตอบ:


65

XML หรือไฟล์หายไปหรือพา ธ ไปไม่ถูกต้องหรือพา ธ create_capture ไม่ถูกต้อง

เส้นทางในตัวอย่าง opencv มีลักษณะดังนี้:

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

ฉันมีปัญหาเดียวกัน

ฉันไม่จำเป็นต้องดาวน์โหลดสิ่งอื่นใดเพื่อแก้ปัญหานี้ CV2 มีทุกสิ่งที่ฉันต้องการ

แทนที่จะพยายามหาว่า.xmlไฟล์อยู่ที่ไหนและเข้ารหัสค่าได้ยากฉันใช้คุณสมบัติที่กำหนดโดย cv2

จาก OP

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

กลายเป็น

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

9
ควรทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้องจะช่วยฉันประหยัดเวลาได้
Joe Albowicz

4
สิ่งนี้ทำงานได้อย่างสมบูรณ์ควรทำเครื่องหมายว่าถูกต้อง
Seaver Olson

คุณได้รับ @VIVID เกิดข้อผิดพลาดอะไร มันใช้ cv2.data.haarcascades หรือกับ cv2.CascadeClassifie?
Mandelbrotter

@Mandelbrotter นี่คือปัญหาของฉัน: stackoverflow.com/questions/63423843/…
VIVID

17

ฉันใช้รหัสเดียวกัน มีสองสิ่งที่ควรทราบที่นี่ 1. ระบุเส้นทางทั้งหมดของไฟล์. xml 2. ให้คำแนะนำเหตุการณ์กดปุ่มในตอนท้าย

เพิ่มรหัสบล็อกนี้ในตอนท้ายและเรียกใช้ไฟล์ของคุณได้ผลสำหรับฉัน:

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

ตัวอย่างเช่นรหัสของฉันดูเหมือน

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

ผลลัพธ์ของฉันมีลักษณะดังนี้:

ouput


เส้นทางที่แน่นอนสำหรับฉันผิดต้องรวม CWD (C: Drive / projectdirectory /) เช่น 'C: / Flask / venv / Lib / site-Packages / cv2 / data /'
ThomasLYIT

11

ใช้เส้นทางไฟล์ทั้งหมดและใช้ "\\" แทน "\" ในเส้นทางไฟล์ xml

เส้นทางของไฟล์ควรเป็นดังนี้:

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

แทน:

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

11

ไฟล์ XML หายไปคุณสามารถรับไฟล์จากที่เก็บ GitHub และวางไว้ในไดเร็กทอรีเดียวกับโปรเจ็กต์ของคุณ เชื่อมโยงไปยังโฟลเดอร์บน GitHub เป็นที่นี่ เพียงดาวน์โหลดไฟล์ชื่อhaarcascade_frontalface_default.xml จริงๆแล้วไฟล์มีอยู่ในระบบของคุณ เพียงไปที่โฟลเดอร์site-packageของโฟลเดอร์การติดตั้ง python และตรวจสอบโฟลเดอร์ cv2 / data สำหรับไฟล์


8

หากคุณใช้ Anaconda คุณควรเพิ่มเส้นทาง Anaconda

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

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

8

ไม่จำเป็นต้องเปลี่ยนรหัส

ดาวน์โหลดไฟล์. xml จากนั้นใส่พา ธ ของไฟล์นั้น

มันจะแก้ข้อผิดพลาด (100%)


5

ข้อผิดพลาดนี้หมายความว่าไม่พบไฟล์ XML ไลบรารีต้องการให้คุณส่งผ่านเส้นทางแบบเต็มแม้ว่าคุณอาจจะใช้ไฟล์ที่มาพร้อมกับไลบรารี OpenCV ก็ตาม

คุณสามารถใช้pkg_resourcesโมดูลในตัวเพื่อกำหนดสิ่งนี้ให้คุณโดยอัตโนมัติ โค้ดต่อไปนี้ค้นหาพา ธ แบบเต็มไปยังไฟล์ภายในทุกที่ที่cv2โหลดโมดูลจาก:

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

สำหรับฉันนี่คือ'/Users/andrew/.local/share/virtualenvs/foo-_b9W43ee/lib/python3.7/site-packages/cv2/data/haarcascade_frontalface_default.xml'; ของคุณรับประกันว่าจะแตกต่าง เพียงแค่ปล่อยให้pkg_resourcesไลบรารีของ python คิดออก

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

สำเร็จ!


4

บน OSX ที่มี homebrew ติดตั้งพา ธ แบบเต็มไปยังโฟลเดอร์ opencv ควรใช้งานได้:

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

ดูแลหมายเลขเวอร์ชันในเส้นทาง


3

น่าจะface_cascadeเป็นที่ว่างเปล่า คุณสามารถตรวจสอบว่าตัวแปรว่างหรือไม่โดยพิมพ์คำสั่งต่อไปนี้:

face_cascade.empty()

หากว่างเปล่าคุณจะได้รับTrueและหมายความว่าไฟล์ของคุณไม่สามารถใช้งานได้ในเส้นทางที่คุณกล่าวถึง พยายามเพิ่มเส้นทางที่สมบูรณ์ของไฟล์ xml ดังต่อไปนี้:

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


3

คุณเพียงแค่ต้องเพิ่มเส้นทางที่เหมาะสมของhaarcascade_frontalface_default.xmlไฟล์เช่นคุณต้องเพิ่มคำนำหน้า ( cv2.data.haarcascades)

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

2

คุณอาจพบข้อผิดพลาดดังกล่าวเมื่อคุณไม่ได้กำหนดเส้นทางทั้งหมดของไฟล์ XML ของคุณ ลองใช้อันนี้ถ้าคุณใช้ opencv3.1.0 ใน raspberrypi 3: " faceCascade = cv2.CascadeClassifier ('/ home / pi / opencv-3.1.0 / data / haarcascades / haarcascade_frontalface_default.xml ')"


2

คุณสามารถแก้ปัญหานี้ได้โดยวาง XML ในไดเร็กทอรีเดียวกับที่วางไฟล์ python หลักของคุณ (จากที่ที่คุณพยายามรวมไฟล์นี้) ตอนนี้ขั้นตอนต่อไปคือการใช้เส้นทางแบบเต็ม ตัวอย่างเช่น

สิ่งนี้จะไม่ทำงาน

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

ใช้เส้นทางแบบเต็มตอนนี้มันจะทำงานได้ดี

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

2

ฉันพบสิ่งนี้ในคำตอบอื่น ๆ แต่ในที่สุดก็ได้ผลสำหรับฉันเมื่อฉันเพิ่มคำตอบทั้งสอง

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 ที่ต้องการไม่ถูกต้อง ค้นหาไฟล์haarcascade_frontalface_default.xml โดยใช้เครื่องมือค้นหาของ ur OS รับเส้นทางแบบเต็มและวางเป็นอาร์กิวเมนต์cv2.CascadeClassifierเป็นสตริง


1

โปรดอย่าคัดลอกและวางเนื้อหาของไฟล์ xml เพราะเมื่อคุณวางลงใน notepad แล้วจะถูกบันทึกเป็นไฟล์ข้อความ ดังนั้นดาวน์โหลดไฟล์โดยตรงจากแหล่งที่มา


1

ฉันพบปัญหาเดียวกัน แต่เขียนตำแหน่งที่ถูกต้อง

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

ฉันคิดว่าฉันต้องประกาศเส้นทางแบบเต็มเพื่อลบข้อผิดพลาด

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

แก้ปัญหาของฉัน! รวมเข้ากับstackoverflow.com/a/3430395/3525780และรับไดเร็กทอรีการทำงานปัจจุบันเสมอ
Fusseldieb

0

ฉันมีปัญหาเดียวกันกับopencv-pythonและฉันใช้สภาพแวดล้อมเสมือนจริง หากเป็นกรณีของคุณคุณควรค้นหาxmlไฟล์ที่:

/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

โปรดแน่ใจว่าคุณกำลังใช้เส้นทางที่แน่นอน ไม่งั้นจะใช้ไม่ได้


0

แนวคิดหลักของการแก้ปัญหาดังกล่าวข้างต้น: ค้นหาเส้นทางที่ถูกต้องของ.xmlไฟล์และใช้เพื่อเข้าถึงไฟล์อย่างถูกต้อง

ในกรณีของฉันฉันติดตั้ง opencv ใน anoconda env ก่อนโดยตรงไปยังเส้นทางของ Anoconda จากนั้น

  • ค้นหาเส้นทางของ.xmlไฟล์โดยใช้:

    $ find . -name 'haarcascade_eye.xml' (ตัวอย่างเช่นค้นหาhaarcascade_eye.xmlไฟล์ใน dir ปัจจุบัน (.))

  • จากนั้นใช้ผลตอบแทนpath:

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


0

ฉันประสบปัญหาที่คล้ายกัน ดูเหมือนว่าการแก้ไขเส้นทางไปยัง XML ทำให้ข้อผิดพลาดนี้หายไป


ยินดีต้อนรับสู่ SO แม้ว่าเราจะขอบคุณสำหรับคำตอบของคุณ แต่จะดีกว่าถ้าคำตอบนั้นให้คุณค่าเพิ่มเติมนอกเหนือจากคำตอบอื่น ๆ ในกรณีนี้คำตอบของคุณไม่ได้ให้คุณค่าเพิ่มเติมเนื่องจากมีคำตอบมากมายที่กล่าวถึงแล้วว่าจะเปลี่ยนเส้นทางไปยัง XML
Doj

-1

ข้อผิดพลาดเกิดขึ้นเนื่องจากไม่มีไฟล์ xml หรือเส้นทางของไฟล์ xml ไม่ถูกต้อง

โปรดลองใช้รหัสต่อไปนี้

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()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.