помилка: (-215)! empty () у функції виявленняMultiScale


88

Я намагаюся вивчити 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 Я замінив оригінальний шлях на запропонований вами, але код повертає ту ж помилку
arthurckl

чи можете ви перевірити, що ваше зображення не порожнє (наприклад, якщо завантажено неправильно), додавши тест або зображення?
Міцька

2
О, розумію, я написав шлях до філи неправильно. Дякую за допомогу !
arthurckl

1
У мене однакова проблема, і як би я не намагався, я не міг її вирішити. Чи можете ви сказати нам, як ви вирішили? @arthurckl
aysebilgegunduz

Відповіді:


61

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

44

У мене була та ж проблема.

Мені не потрібно було завантажувати нічого іншого, щоб вирішити це. У CV2 було все, що мені потрібно.

Замість того, щоб намагатись з’ясувати, де .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')

6
Це слід позначити як правильну відповідь, це заощадило б мені час.
Джо Альбовіч

2
Це спрацювало чудово, це слід позначити правильно
Сівер Олсон

Яку помилку ви отримали @VIVID? Це було з cv2.data.haarcascades чи з cv2.CascadeClassifie?
Мандельброттер

@Mandelbrotter Ось моя проблема: stackoverflow.com/questions/63423843/…
VIVID

16

Я запустив той самий код. Тут слід зазначити дві речі. 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 / 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-пакети вашої інсталяційної папки 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 з домашньою інсталяцією повинен працювати повний шлях до папки 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

"\ Anaconda3 \ Lib \ site-пакети \ cv2 \ data \" Я знайшов файл xml у цьому шляху для Anaconda


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)

2

Вам просто потрібно додати правильний шлях до 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')

1
Цей підхід також спрацював для мене
Маф

1

Ваш файл XML не знайдено. Спробуйте використовувати абсолютні шляхи, як:

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

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файлу та використати його для правильного доступу до файлу.

У моєму випадку я встановив opencv в anoconda env, спочатку прямий шлях до Anoconda, потім

  • знайти шлях до .xmlфайлу за допомогою:

    $ find . -name 'haarcascade_eye.xml' (наприклад, шукати haarcascade_eye.xmlфайл у поточному каталозі (.))

  • Потім використовуйте функцію return path:

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


-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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.