오류 : 'detectMultiScale'함수의! empty ()

Aug 15 2020

다음과 같은 작은 코드가 있습니다.

from google.colab import drive
from IPython.display import display
import PIL
from PIL import Image, ImageDraw
import kraken
from kraken import pageseg
import cv2 as cv

img = Image.open("/content/drive/My Drive/images/dropfire.jpg")

face_cascade = cv.CascadeClassifier(cv.data.haarcascades + "/content/drive/My Drive/datas/haarcascade_frontalface_default.xml")
eye_cascade = cv.CascadeClassifier(cv.data.haarcascades + "/content/drive/My Drive/datas/haarcascade_eye.xml")

file_name = "/content/drive/My Drive/images/dropfire.jpg"
img = cv.imread(file_name)
pil_img = Image.open(file_name)
cv_img = pil_img.convert('L')
cv_img = cv.imread(file_name)

faces = face_cascade.detectMultiScale(cv_img)

마지막 셀 (사용 faces)을 실행하면 다음이 발생합니다.

error                                     Traceback (most recent call last)
<ipython-input-23-2bd7582f8a20> in <module>()
----> 1 faces = face_cascade.detectMultiScale(cv_img)

error: OpenCV(4.1.2) /io/opencv/modules/objdetect/src/cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'detectMultiScale'

이 셀까지 모든 것이 잘 작동합니다. StackOverflow 답변 에 따르면 cv.data.haarcascades + 괄호 안에 추가 했습니다 cv.CascadeClassifier. 사람들은 이것이 그들에게 효과적이라고 말했지만 어떻게 든 나에게는 그렇지 않습니다 ...

도움을 주시면 감사하겠습니다.

답변

Ewalldinho Aug 20 2020 at 05:30

imho, 당신의 "작은 코드"는 이미 너무 많은 노이즈 (불필요한 코드 라인)를 가지고 있습니다. 무슨 일이 일어나고 있는지 이해하기가 더 어려워 진다고 생각합니다.

다음을 제외한 모든 줄을 주석 처리 / 삭제합니다.

    import cv2 as cv
    
    face_cascade = cv.CascadeClassifier(cv.data.haarcascades + "haarcascade_frontalface_default.xml")
    eye_cascade = cv.CascadeClassifier(cv.data.haarcascades + "haarcascade_eye.xml")

    file_name = "/content/drive/My Drive/images/dropfire.jpg"
    img = cv.imread(file_name)  # this reads the image already
    
    cv_img = cv.imread(file_name) # this reads same image once more, not sure if intended
    faces = face_cascade.detectMultiScale(cv_img)  

이미지 "dropfire"가 실제로 해당 경로에 존재하는 경우 오류없이 작동하지만 얼굴 감지 결과는 표시되지 않습니다. 결과를보기 위해 끝에 다음 줄을 추가 할 수 있습니다.

    for (x, y, w, h) in faces:
        cv.rectangle(cv_img, (x, y), (x+w, y+h), (0, 0, 255), 3)
    cv.imshow("Nice face", cv_img)
    cv.waitKey(0)

cv.data.haarcascades에는 이미 모든 cv2 xml 파일에 대한 경로가 있으므로 파일 이름 만 사용하면됩니다.

SubramanyaKulal Dec 08 2020 at 00:17

문제는 XML eye_cascade.empty()이로드되었는지 여부를 확인하고로드되었는지 여부를 확인하는 데 사용 됩니다.