ошибка: (-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 неправильно ... Любая помощь?

Arthurckl
источник
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)

Успех!

Andrewdotn
источник
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

My3
источник
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')
am2505
источник
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')
KiLLua
источник
Решил мою проблему! Объедините это с 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

Убедитесь, что вы используете абсолютный путь. Иначе ничего не получится.

Lenhhoxung
источник
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()
Codemaker
источник