error: (-215)! blank () trong hàm detectorMultiScale


88

Tôi đang cố gắng học cv2 trong python 2.7, nhưng khi tôi chạy mã của mình, trong phần cụ thể của nó:

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)

nó trả về cái này:

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

Tôi đã cố gắng tìm kiếm câu trả lời ở đây nhưng tốt nhất tôi có thể tìm thấy là tôi phải tải face_cascade sai cách ... Bất kỳ trợ giúp nào?


28
tệp xml của bạn không được tìm thấy. thử một đường dẫn tuyệt đối như "/my/files/bla/cacade.xml"
berak

@berak Tôi đã thay thế đường dẫn ban đầu cho đường dẫn bạn đề xuất nhưng mã trả về lỗi tương tự
arthurckl

bạn có thể xác minh rằng hình ảnh của bạn không trống (ví dụ: nếu không được tải đúng cách) bằng cách thêm thử nghiệm hoặc hiển thị hình ảnh?
Micka

2
Ồ, hiểu rồi, tôi đã viết sai đường dẫn fila. Cảm ơn đã giúp đỡ !
arthurckl

1
Tôi có cùng một vấn đề và cho dù tôi đã cố gắng thế nào, tôi vẫn không thể giải quyết được. Bạn có thể cho chúng tôi biết bạn đã giải quyết như thế nào không? @arthurckl
aysebilgegunduz

Câu trả lời:


61

XML hoặc tệp bị thiếu hoặc đường dẫn đến nó không chính xác hoặc đường dẫn create_capture không chính xác.

Các đường dẫn trong mẫu opencv trông giống như sau:

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

Tôi gặp vấn đề tương tự.

Tôi không cần tải xuống bất kỳ thứ gì khác để giải quyết vấn đề này. CV2 có mọi thứ tôi cần.

Thay vì cố gắng tìm ra vị trí của .xmlcác tệp và cố gắng mã hóa các giá trị, tôi đã sử dụng một thuộc tính do cv2 cung cấp.

Từ OP

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

Trở thành

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')

6
Đây nên được đánh dấu là câu trả lời đúng, sẽ giúp tôi tiết kiệm thời gian.
Joe Albowicz

2
Điều này hoạt động hoàn hảo, điều này phải được đánh dấu là chính xác
Seaver Olson

Bạn gặp lỗi gì @VIVID? Đó là với cv2.data.haarcascades hay với cv2.CascadeClassifie?
Mandelbrotter

@Mandelbrotter Đây là vấn đề của tôi: stackoverflow.com/questions/63423843/…
VIVID

16

Tôi đã chạy cùng một mã. Có hai điều cần lưu ý ở đây. 1. Cung cấp toàn bộ đường dẫn của các tệp .xml. 2. Đưa ra hướng dẫn sự kiện nhấn phím ở cuối.

Thêm khối mã này vào cuối và chạy tệp của bạn, phù hợp với tôi:

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()

Ví dụ: mã của tôi trông giống như

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()

Đầu ra của tôi trông như thế này:

ouput


đường dẫn tuyệt đối đối với tôi là sai khi phải bao gồm CWD (C: Drive / projectdirectory /) tức là 'C: / Flask / venv / Lib / site-Package / cv2 / data /'
ThomasLYIT

11

Sử dụng toàn bộ đường dẫn tệp và sử dụng "\\" thay vì "\" trong đường dẫn tệp xml.

Đường dẫn tệp phải như sau:

face_cascade = cv2.CascadeClassifier('C:\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_default.xml')

thay vì:

cascade_fn = args.get('--cascade', "..\..\data\haarcascades\haarcascade_frontalface_alt.xml")

11

Tệp XML bị thiếu, bạn có thể lấy tệp từ kho lưu trữ GitHub và đặt nó trong cùng thư mục với dự án của bạn. Liên kết đến thư mục trên GitHub ở đây . Chỉ cần tải xuống tệp có tên haarcascade_frontalface_default.xml . Trên thực tế, tệp tồn tại trên hệ thống của bạn. Chỉ cần chuyển đến thư mục gói trang của thư mục cài đặt python của bạn và kiểm tra thư mục cv2 / data cho tệp


8

Nếu bạn đang sử dụng Anaconda, bạn nên thêm đường dẫn Anaconda.

new_path = 'C:/Users/.../Anaconda/Library/etc/haarcascades/'

face_cascade = cv2.CascadeClassifier(new_path + 'haarcascade_frontalface_default.xml')

8

không cần thay đổi mã

tải xuống tệp .xml đó, sau đó đặt đường dẫn của tệp đó

nó sẽ giải quyết lỗi (100%)


5

Lỗi này có nghĩa là không thể tìm thấy tệp XML. Thư viện cần bạn chuyển nó theo đường dẫn đầy đủ, mặc dù có thể bạn chỉ đang sử dụng một tệp đi kèm với thư viện OpenCV.

Bạn có thể sử dụng pkg_resourcesmô-đun tích hợp để tự động xác định điều này cho bạn. Đoạn mã sau tìm kiếm đường dẫn đầy đủ đến một tệp bên trong bất kỳ nơi nào cv2mô-đun được tải từ:

import pkg_resources
haar_xml = pkg_resources.resource_filename(
    'cv2', 'data/haarcascade_frontalface_default.xml')

Đối với tôi đây là '/Users/andrew/.local/share/virtualenvs/foo-_b9W43ee/lib/python3.7/site-packages/cv2/data/haarcascade_frontalface_default.xml'; của bạn được đảm bảo là khác nhau. Chỉ cần để pkg_resourcesthư viện của python tìm ra nó.

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

Sự thành công!


4

Trên OSX với homebrew, cài đặt đường dẫn đầy đủ đến thư mục opencv sẽ hoạt động:

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')

Hãy quan tâm đến số phiên bản trong đường dẫn.


3

Có lẽ face_cascadelà trống. Bạn có thể kiểm tra xem biến có trống hay không bằng cách gõ lệnh sau:

face_cascade.empty()

Nếu nó trống, bạn sẽ nhận được Truevà điều này có nghĩa là tệp của bạn không có sẵn trong đường dẫn bạn đã đề cập. Cố gắng thêm đường dẫn hoàn chỉnh của tệp xml như sau:

r'D:\folder Name\haarcascade_frontalface_default.xml'

3

"\ Anaconda3 \ Lib \ site-pack \ cv2 \ data \" Tôi đã tìm thấy tệp xml trong đường dẫn này cho Anaconda


2

Bạn có thể tìm thấy những lỗi như vậy khi bạn không xác định đường dẫn đầy đủ của tệp XML của mình. Hãy thử cái này nếu bạn đang sử dụng opencv3.1.0 trong raspberrypi 3: " faceCascade = cv2.CascadeClassifier ('/ home / pi / opencv-3.1.0 / data / haarcascades / haarcascade_frontalface_default.xml ')"


2

Bạn có thể giải quyết vấn đề này bằng cách đặt XML vào cùng một thư mục mà tệp python chính của bạn (từ nơi bạn đã cố gắng bao gồm tệp này) đã được đặt. Bây giờ bước tiếp theo là sử dụng đường dẫn đầy đủ. Ví dụ

Điều này sẽ không hoạt động

front_cascade = cv2.CascadeClassifier('./haarcascade_eye.xml')

Sử dụng đường dẫn đầy đủ, bây giờ nó sẽ hoạt động tốt

front_cascade = cv2.CascadeClassifier('/Users/xyz/Documents/project/haarcascade_eye.xml')

2

Tôi tìm thấy điều này trong một số câu trả lời khác nhưng cuối cùng đã hiệu quả với tôi khi tôi thêm hai câu trả lời.

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

Bạn chỉ cần thêm đường dẫn thích hợp của haarcascade_frontalface_default.xmltệp, tức là bạn chỉ phải thêm tiền tố ( 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
Cách tiếp cận này cũng hiệu quả với tôi
Maf

1

Không tìm thấy tệp XML của bạn. Hãy thử sử dụng các đường dẫn tuyệt đối như:

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

1

lỗi có thể do, các tệp xml cần thiết đã không được tải đúng cách. Tìm kiếm tệp haarcascade_frontalface_default.xml bằng cách sử dụng công cụ tìm kiếm của ur OS lấy đường dẫn đầy đủ và đặt nó làm đối số cho cv2.CascadeClassifierchuỗi


1

Vui lòng không sao chép, dán nội dung của tệp xml, vì sau khi bạn dán nó vào notepad, nó sẽ được lưu dưới dạng tệp văn bản. Vì vậy, trực tiếp tải xuống tệp từ nguồn đã cho.


1

Tôi gặp phải vấn đề tương tự. nhưng đã viết đúng vị trí.

face_cascade = cv2.CascadeClassifier('./model/haarcascade_frontalface_default.xml')

Tôi đã tìm ra rằng tôi cần phải khai báo đường dẫn đầy đủ để loại bỏ lỗi.

face_cascade = cv2.CascadeClassifier('C:/pythonScript/Facial-Emotion-Detection/model/haarcascade_frontalface_default.xml')

Đã giải quyết vấn đề của tôi! Kết hợp điều đó với stackoverflow.com/a/3430395/3525780 và luôn nhận được thư mục làm việc hiện tại
Fusseldieb

0

Tôi đã gặp vấn đề tương tự opencv-pythonvà tôi đã sử dụng một môi trường ảo. Nếu đó là trường hợp của bạn, bạn nên tìm các xmltệp tại:

/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

Hãy chắc chắn rằng bạn đang sử dụng đường dẫn tuyệt đối. Nếu không, nó sẽ không hoạt động.


0

Ý tưởng chính của giải pháp như đã đề cập ở trên: tìm đúng đường dẫn của .xmltệp và sử dụng nó để truy cập tệp một cách chính xác.

Trong trường hợp của tôi, tôi đã cài đặt opencv trong anoconda env, trước tiên là trực tiếp đến đường dẫn của Anoconda, sau đó

  • tìm con đường của .xml tệp bằng cách sử dụng:

    $ find . -name 'haarcascade_eye.xml' (ví dụ: tìm kiếm haarcascade_eye.xmltệp trong dir (.) hiện tại)

  • Sau đó sử dụng lợi nhuận path:

eye_cascade = cv2.CascadeClassifier(path + 'haarcascade_eye.xml')


-1

Lỗi xảy ra do thiếu tệp xml hoặc đường dẫn tệp xml không chính xác.

Vui lòng thử mã sau,

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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.