CascadeClassifier в OpenCV генерирует ошибку

Я пытаюсь разработать простое приложение для обнаружения лиц, а также глаз на данном изображении:

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

img = imread("123.jpg")
gray = cvtColor(img, COLOR_BGR2GRAY)
rows,cols = gray.shape
gray = getRotationMatrix2D((cols/2,rows/2),-90,1)

faces = face_cascade.detectMultiScale(gray, 1.3, 5, 0)
print faces

for (x,y,w,h) in faces:
    img = rectangle(img, (x,y), ((x+w),(x+h)), (255,0,0), 2)
    #gray = rectangle(gray, (x,y), ((x+w), (x+y)), (0, 255, 0), 4)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]
    eyes = eye_cascade.detectMultiScale(roi_grey)
    for (ex,ey, ew, eh) in eyes:
        roi_color = rectangle(roi_color, (x,y), ((x+w), (y+h)), (50, 50, 50), 3)

imshow("img", img)
waitKey(9)
destroyAllWindows()

(Примечание: поворот необходим, так как после использования функции cvtColor выходное изображение создается с поворотом на 90 градусов против часовой стрелки.)

Я получаю следующую ошибку:

Отслеживание (последний вызов последним): файл "/home/namit/Codes/wow.py", строка 10, в faces = face_cascade.detect Ошибка MultiScale (серый, 1.3, 5, 0): / home / namit / OpenCV / opencv -2.4.9 / modules / objdetect / src / cascadedetect.cpp: 1081: ошибка: (-215) scaleFactor> 1 && image.depth () == CV_8U в функции detectMultiScale


person Namit Juneja    schedule 26.07.2014    source источник
comment
С какой ошибкой вы столкнулись в какой строке (ах) кода?   -  person paisanco    schedule 26.07.2014


Ответы (1)


Причина сообщения об ошибке заключалась в том, что изображение gray было float64, а face_cascade.detectMultiScale требует беззнакового целого числа. Чтобы исправить это, нужно преобразовать изображение в uint8 перед вызовом face_cascade.detectMultiScale:

import numpy as np
gray = np.array(gray, dtype='uint8')

Были и другие проблемы. Во-первых, cv2.rectangle не возвращает изображение; вместо этого он изменяет изображение, которое вы ему передаете. У меня работает следующее:

from cv2 import *
import numpy as np
face_cascade = CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = CascadeClassifier('haarcascade_eye.xml')

fname='123.jpg'
img = imread(fname)
gray = imread(fname, CV_LOAD_IMAGE_GRAYSCALE)
rows,cols = gray.shape

gray = np.array(gray, dtype='uint8')
faces = face_cascade.detectMultiScale(gray, 1.3, 5, 0)
print 'faces=', faces

for (x,y,w,h) in faces:
    rectangle(img, (x,y), ((x+w),(x+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:
        rectangle(roi_color, (x,y), ((x+w), (y+h)), (50, 50, 50), 3)
    imshow('eyes=%s' % (eyes,), roi_color)

imshow("img", img)
waitKey(0)
destroyAllWindows()

Проблем с поворотом изображения не наблюдал, поэтому убрал код поворота.

person John1024    schedule 26.07.2014