Detectmultiscale () иногда возвращает пустой кортеж - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь использовать каскад Хаара в OpenCV 4.0 для определения лиц для оценки эмоций, пола и возраста. иногда функция detemultiscale () возвращает пустой кортеж, что вызывает ошибку в более поздних частях распознавания.

Я пытался создать цикл while до тех пор, пока лицо не будет обнаружено, но, кажется, что после того, как лицо не обнаружено, оно не обнаруживается снова (в том же захваченном кадре), я получаю пустые кортежи. Странно то, что иногда программа работает без нареканий. модель обнаружения загружается правильно, поскольку cv2.CascadeClassifier.empty (face_cascade) возвращает False.

Кажется, нет проблем с захваченным кадром, так как я могу правильно его отобразить.

после поиска я обнаружил, что detectmultiscale () фактически возвращает пустой кортеж, когда лица не обнаружены.

Код обнаружения лица Python OpenCV иногда вызывает объект `'tuple', не имеющий атрибута 'shape'`

face_cascade = cv2.CascadeClassifier(
        'C:\\Users\\kj\\Desktop\\jeffery 1\\trained_models\\detection_models\\haarcascade_frontalface_alt.xml')
 retval = cv2.CascadeClassifier.empty(face_cascade)
 print(retval)

возвращает False

def video_cap(out_queue):
        video_capture = cv2.VideoCapture(0, cv2.CAP_DSHOW)
        #video_capture.set(3, 768)
        #video_capture.set(4, 1024)
        while True:
                ret, bgr_image = video_capture.read()
                cv2.imshow('frame',bgr_image)
                cv2.waitKey(1000)
                cv2.destroyAllWindows()
                if video_capture.isOpened() == False :
                    video_capture.open(0)

                if(ret):
                    gray_image = cv2.cvtColor(bgr_image, cv2.COLOR_BGR2GRAY)  
                    rgb_image = cv2.cvtColor(bgr_image, cv2.COLOR_BGR2RGB)  
                    faces = detect_faces(face_detection, gray_image)
                    ret_list = [gray_image, rgb_image, faces]
                    print("DEBUG: VIDEO_CAPTURE MODULE WORKING")
                    out_queue.put(ret_list)
                    return

Функция video_cap является потоковой

def detect_faces(detection_model, gray_image_array):
    faces1 = detection_model.detectMultiScale(gray_image_array, scaleFactor= 2, minNeighbors=10,minSize=(64,64))
    while(len(faces1)== 0 ):
        faces1 = detection_model.detectMultiScale(gray_image_array, scaleFactor=2, minNeighbors=10, minSize=(64, 64))
        print(faces1)
        if(len(faces1)!=0):
            break
    return faces1

Я получаю вывод: () () () () ....

продолжается до тех пор, пока я не закончу.

как мне решить проблему?

1 Ответ

0 голосов
/ 02 апреля 2019

Это фрагмент кода, который я использовал.Я удалил аргументы ARGUMENTS в функции deteMultiScale (), и он работал нормально.

Кроме того, убедитесь, что у вас правильный путь к файлам xml.

classifier = cv2.CascadeClassifier("../../../l-admin/anaconda3/lib/python3.6/site-packages/cv2/data/haarcascade_frontalface_default.xml")
img = cv2.imread('../Tolulope/Adetula Tolulope (2).jpg')
face = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = classifier.detectMultiScale(face)
print(type(faces), faces)
for (x, y, w, h) in faces:
  img = cv2.imwrite("facesa.png", cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 3))

Что касается вторичной ноты, моя собственная работа могла состоять в том, что моя камера обнаружила мое лицо из-за молнии.Поэтому я предлагаю вам сначала попробовать его с изображением, прежде чем использовать видео.

...