오류 : detectMultiScale 함수의 (-215)! empty ()


88

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

테스트 또는 이미지 표시를 추가하여 이미지가 비어 있지 않은지 (예 : 올바르게로드되지 않은 경우) 확인할 수 있습니까?
Micka

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에서 제공하는 속성을 사용했습니다.

OP에서

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
이것은 정답으로 표시되어야하며 시간을 절약 할 수있었습니다.
Joe Albowicz

2
이것은 완벽하게 작동했습니다. 올바른 것으로 표시되어야합니다
Seaver Olson

@VIVID에서 어떤 오류가 발생 했습니까? cv2.data.haarcascades 또는 cv2.CascadeClassifie를 사용 했습니까?
Mandelbrotter

@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

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 이라는 파일을 다운로드하면됩니다 . 실제로 파일은 시스템에 있습니다. Python 설치 폴더 의 site-packages 폴더 로 이동 하여 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라이브러리가 알아 내도록하십시오.

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

성공!


4

homebrew를 사용하는 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 \"Anaconda의이 경로에서 xml 파일을 찾았습니다.


2

XML 파일의 전체 경로를 정의하지 않은 경우 이러한 종류의 오류를 찾을 수 있습니다. raspberrypi 3에서 opencv3.1.0을 사용하는 경우이 방법을 사용해보십시오. " faceCascade = cv2.CascadeClassifier ( '/ home / pi / opencv-3.1.0 / data / haarcascades / haarcascade_frontalface_default.xml ')"


2

이 문제를 해결 하려면 기본 Python 파일 (이 파일을 포함하려고 한 위치)이 있는 동일한 디렉토리에 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)

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

XML 파일을 찾을 수 없습니다. 다음과 같은 절대 경로를 사용해보십시오.

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

1

오류는 필수 xml 파일이 제대로로드되지 않았기 때문일 수 있습니다. haarcascade_frontalface_default.xml UR OS의 검색 엔진을 사용하여 파일 을 검색하여 전체 경로를 가져와 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 과 결합 하여 항상 현재 작업 디렉토리를 가져
오십시오

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파일 의 올바른 경로를 찾아 파일에 올바르게 액세스하는 데 사용하는 것입니다.

제 경우에는 anoconda env에 opencv를 설치하고 먼저 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()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.