त्रुटि: (-215)! खाली () फ़ंक्शन का पता लगाने में


97

मैं python 2.7 में cv2 सीखने की कोशिश कर रहा हूं, लेकिन जब मैं इसके विशिष्ट भाग में, अपना कोड चलाता हूं:

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
ओह, मैं समझ गया, मैंने फिल्मा रास्ता गलत तरीके से लिखा है। सहायता के लिए धन्यवाद !
आर्थरक्ल

1
मेरे पास एक ही मुद्दा है और कोई फर्क नहीं पड़ता कि मैंने कितनी कोशिश की मैं इसे हल नहीं कर सका। क्या आप बता सकते हैं कि आपने कैसे हल किया? @ रर्थर्कल
अयसेबिलगेगुंड

जवाबों:


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

मेरी भी यही समस्या थी।

मुझे इसे हल करने के लिए कुछ और डाउनलोड करने की आवश्यकता नहीं थी। सीवी 2 में मेरी जरूरत की हर चीज थी।

यह पता लगाने की कोशिश करने के बजाय कि .xmlफाइलें कहां हैं और मूल्यों को कोडिंग करना मुश्किल है, मैंने cv2 द्वारा दी गई संपत्ति का उपयोग किया।

ओपी से

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
इसे सही उत्तर के रूप में चिह्नित किया जाना चाहिए, इससे मेरा समय बचेगा।
जो एल्बोविक्ज़

4
यह पूरी तरह से काम किया है यह सही चिह्नित किया जाना चाहिए
सीवर ऑलसन

आपको @VIVID में क्या त्रुटि हुई? यह cv2.data.haarcascades के साथ या cv2.CascadeClassifie के साथ था?
मंडेलब्रॉट्टर

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

मेरा आउटपुट इस तरह दिखता है:

उत्पादन


मेरे लिए पूर्ण पथ गलत था जिसमें CWD (C: Drive / projectdirectory /) अर्थात 'C: / Flask / venv / Lib / साइट-संकुल / cv2 / डेटा /' शामिल था
थॉमसली

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 नाम की फ़ाइल डाउनलोड करें । वास्तव में, फ़ाइल आपके सिस्टम पर मौजूद है। बस अपने अजगर स्थापना फ़ोल्डर के साइट-संकुल फ़ोल्डर पर जाएं और फ़ाइल के लिए cv2 / डेटा फ़ोल्डर की जांच करें


8

यदि आप एनाकोंडा का उपयोग कर रहे हैं तो आपको एनाकोंडा पथ जोड़ना चाहिए।

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

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


5

इस त्रुटि का अर्थ है कि XML फ़ाइल नहीं मिली। लाइब्रेरी को आपको पूर्ण पथ पास करने की आवश्यकता है, भले ही आप शायद केवल एक फ़ाइल का उपयोग कर रहे हैं जो ओपनसीवी लाइब्रेरी के साथ आई थी।

आप अपने लिए यह निर्धारित करने के लिए अंतर्निहित 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लाइब्रेरी का पता लगा लेते हैं।

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

सफलता!


4

OSX पर होमब्रेव के साथ ऑपनेंव फ़ोल्डर में पूर्ण पथ को काम करना चाहिए:

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

"\ Anaconda3 \ Lib \ site-package \ cv2 \ data \" मुझे एनाकोंडा के रास्ते में 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 फ़ाइल के पूर्ण पथ को परिभाषित नहीं करते हैं, तो आपको इस तरह की त्रुटियाँ हो सकती हैं। यदि आप raspberrypi 3 में opencv3.1.0 का उपयोग कर रहे हैं तो यह एक आज़माएँ: " faceCascade = cv2.CascadeClassifier ('/ home / pi / opencv-3.1.0 / data / haarcascade_frontalface_default.xml ')"


2

आप XML को उसी डायरेक्टरी में रखकर इस समस्या को हल कर सकते हैं जिसमें आपकी मुख्य पायथन फाइल है (जहां से आपने इस फाइल को शामिल करने की कोशिश की थी) रखी गई थी। अब अगला कदम पूर्ण पथ का उपयोग करना है। उदाहरण के लिए

यह काम नहीं करेगा

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 उर ओएस के खोज इंजन का उपयोग करके फ़ाइल के लिए खोज करें पूर्ण पथ प्राप्त करें और इसे cv2.CascadeClassifierस्ट्रिंग के रूप में तर्क के रूप में डालें


1

कृपया xml फ़ाइल की सामग्री को कॉपी पेस्ट न करें, क्योंकि एक बार जब आप इसे नोटपैड में पेस्ट करते हैं तो इसे टेक्स्ट फ़ाइल के रूप में सहेजा जाएगा। इसलिए सीधे दिए गए स्रोत से फाइल डाउनलोड करें।


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फ़ाइल का सही मार्ग ढूंढें और फ़ाइल का सही तरीके से उपयोग करने के लिए इसका उपयोग करें।

मेरे मामले में, मैंने एनोकोंडा एन्व में ओपेकव स्थापित किया, पहले एनाकोंडा के मार्ग पर सीधा, फिर

  • .xmlफ़ाइल का उपयोग करके पथ खोजें :

    $ find . -name 'haarcascade_eye.xml' (उदाहरण के लिए haarcascade_eye.xmlवर्तमान dir (।) में फ़ाइल खोजें )

  • फिर वापसी का उपयोग करें path:

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


0

मुझे इसी तरह के मुद्दे का सामना करना पड़ा। ऐसा लगता है कि 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()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.