ошибка: (-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.