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, face = = face_cascade.detectMultiScale(серый, 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
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()
Я не заметил проблемы с поворотом изображения, поэтому удалил код поворота.