ошибка: (-215)! empty () в функции detectMultiScale


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

@berak Я заменил исходный путь на тот, который вы предложили, но код возвращает ту же ошибку
— arthurckl

Можете ли вы проверить, что ваше изображение не пустое (например, если оно не загружено правильно), добавив тест или отображающее изображение?
— Мика

2
О, я понял, я неправильно написал путь fila. Спасибо за помощь !
— 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-packages в папке установки 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-packages \ 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файлу, то есть вам нужно только добавить prefix ( 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
Этот подход также сработал для меня
— Maf

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файла в текущем каталоге (.))

  • Затем используйте возврат 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.