'bool' объект не повторяемый

Я работаю над python3, opencv 3.4 и использую функцию Microsoft Azure FaceAPI 'CF.face.detect()'. Насколько мне известно, для цикла for требуется итерируемый объект для запуска в подобном списке, но простое логическое значение не является итерируемым. Хотя «res1» — это список, я получаю эту ошибку.

TypeError: объект 'bool' не повторяемый

Пожалуйста, помогите, заранее спасибо

Вот код:

CF.Key.set('') 
#print(CF.Key.get()) 
CF.BaseUrl.set('https://southeastasia.api.cognitive.microsoft.com/face/v1.0/')
#print(CF.BaseUrl.get())
"""Setup Person and Person Group related data."""
person_group_id = '' #id from training terminal
"""Unittest for `face.detect`."""

cap = cv2.VideoCapture('1.mp4') 
while(cap.isOpened()): 
    ret, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    print("\n\n ##########.... LOOKING FOR FACES ....##########  \n\n")
    res1 = []
    print(type(res1))
    res1 = CF.face.detect(cap)

    print('\n This is the res1:  ', res1) 
    c = len(res1)
    print('\nTOTAL FACES FOUND:', c) 

    detect_id = [] ##error was here so put exception
    for i in range(c):
        print("\n\n ##########.... DETECTING FACES ....##########  \n\n")
        print('\n This is i in range c', i, c)
        detect_id.append(res1[i]['faceId'])
        #print('\n\n detected faces id ', detect_id[i])

        width  = res1[i]['faceRectangle']['width'] 
        height = res1[i]['faceRectangle']['height']
        x      = res1[i]['faceRectangle']['left']
        y      = res1[i]['faceRectangle']['top']
################## IF ENDS #########################################################################
cv2.imshow('image',img)
    k = cv2.waitKey(100) & 0xff
    if k == 27:
            break
################ WHILE ENDS ####################################
cap.release()
cv2.destroyAllWindows()

person Afshan Anwarali    schedule 18.09.2018    source источник


Ответы (3)


@Jonasz прав, вы должны обнаруживать лица на изображениях, то есть в кадрах из вашего файла mp4.

Метод CF.face.detect ожидает URI, поэтому в следующем коде мы запишем его на диск перед передачей в CF.face.detect:

cap = cv2.VideoCapture('1.mp4') 
count = 0  # <--
while(cap.isOpened()): 
    ret, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    filename = "frame%d.jpg" % count  # <--
    cv2.imwrite(filename, img)  # <--
    count+=1  # <--

    print("\n\n ##########.... LOOKING FOR FACES ....##########  \n\n")
    res1 = []
    print(type(res1))
    res1 = CF.face.detect(filename)  # <--
person delephin    schedule 18.09.2018

Разве вы не должны использовать CF.face.detect для захваченного изображения, а не для переменной cap?

person Jonasz    schedule 18.09.2018
comment
Я пытаюсь обнаружить лица на видео «1.mp4». Не могу написать это прямо в CF.face.detect - person Afshan Anwarali; 18.09.2018
comment
Но, насколько я понимаю, функция CF.face.detect принимает изображение в качестве аргумента, и вы пытаетесь передать туда видео. Я не знаком с этой библиотекой, но я думаю, что концепция заключается в захвате отдельных кадров из видео. Затем обнаруживайте лица на них, передавая захваченные изображения в функцию. - person Jonasz; 18.09.2018

@delephin О, это работает! но я хочу, чтобы CF.face.detect() работал с любым кадром через 5 секунд. Пожалуйста, посмотрите, вот мой полный код:

import unittest
import cognitive_face as CF
from PIL import Image, ImageFont, ImageDraw
import time
import cv2
from time import strftime

CF.Key.set('')  
CF.BaseUrl.set('https://southeastasia.api.cognitive.microsoft.com/face/v1.0/')
person_group_id = '' 

cap = cv2.VideoCapture('emma.mp4') 
count = 0

while(cap.isOpened()): 
    ret, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    filename = "frame%d.jpg" % count
    cv2.imwrite(filename, img)
    count+=1 

    S1 = int(strftime("%S"))
    millis = int(round(time.time() * 1000))          
    previous_millis = 0
    interval = 5000000

    if(int(millis-previous_millis) >= interval): 
        previous_millis = millis
        print("\n\n ##########.... LOOKING FOR FACES ....##########  \n\n")

        res1 = CF.face.detect(filename) 
        print('\n This is the res1:  ', res1) 
        c = len(res1)
        print('\nTOTAL FACES FOUND:', c) 

        try:
            detect_id = [] ##error was here so put exception
            for i in range(c):
                print("\n\n ##########.... DETECTING FACES ....##########  \n\n")
                print('\n This is i in range c', i, c)
                detect_id.append(res1[i]['faceId'])
                #print('\n\n detected faces id ', detect_id[i])

                width  = res1[i]['faceRectangle']['width'] 
                height = res1[i]['faceRectangle']['height']
                x      = res1[i]['faceRectangle']['left']
                y      = res1[i]['faceRectangle']['top']

    ######################## IDENTIFICATION ##########################################################################
                print("\n\n ###########.... IDENTIFYING FACES....############# \n\n")
                res2 = CF.face.identify( [detect_id[i]], person_group_id = person_group_id)###big error

                try:
                    recognized_id = res2[0]['candidates'][0]['personId'] 
                    res3 = CF.person.get(person_group_id, recognized_id )
                    #print('Identified person{0}: ', res3) 
                    name = res3['name']
                    print('\nThe image is of Detected person is: ', name)

                    im = Image.open(image) 
                    dr = ImageDraw.Draw(im)

                    dr.rectangle(((x,y),(x+width,y+height)), outline = "blue")
                    font = ImageFont.truetype("/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-M.ttf", 16)
                    dr.text((x, y),name,(255,255,255),font=font)

                    im.show(im)
                    time.sleep(5)

                except:
                    print ('\nPerson is not Trained !!' )
        except: 
            c = 0
            print('Face count is:', c, "No Face Found") 
################## IF ENDS ######################################################################################
    cv2.imshow('image',img)
    k = cv2.waitKey(100) & 0xff
    if k == 27:
            break
################ WHILE ENDS ###############################################################################
cap.release()
cv2.destroyAllWindows()
person Afshan Anwarali    schedule 18.09.2018
comment
Я не пробовал этого, но у cv2 уже есть некоторые свойства, которые вы можете использовать для достижения того, чего хотите. Вы должны установить CV_CAP_PROP_POS_MSEC, которая является текущей позицией видеофайла в миллисекундах, на желаемую позицию. Скажите cap.set(cv2.CAP_PROP_POS_MSEC,5000) # перед первым вызовом cap.read(). Я обновлю свой ответ, если хотите. - person delephin; 18.09.2018