Объект 'bool' не повторяется

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

TypeError: объект 'bool' не повторяется

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

Вот код: импорт unittest импортировать когнитивное_лицо как CF из PIL импортировать Image, ImageFont, ImageDraw время импорта импорт cv2 от времени import strftime

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()
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
384
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Я пытаюсь обнаружить лица на видео 1.mp4. Не могу записать это прямо в CF.face.detect

Afshan Anwarali 18.09.2018 08:15

Но насколько я понимаю, функция CF.face.detect принимает изображение в качестве аргумента, и вы пытаетесь передать туда видео. Я не знаком с этой библиотекой, но думаю, что концепция заключается в захвате отдельных кадров из видео. Затем обнаруживайте лица на них, передавая захваченные изображения функции.

Jonasz 18.09.2018 08:27
Ответ принят как подходящий

@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)  # <--

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

Я не пробовал этого, но cv2 уже имеет некоторые свойства, которые вы можете использовать для достижения желаемого. Вы должны установить CV_CAP_PROP_POS_MSEC, которая является текущей позицией видеофайла в миллисекундах, в нужную позицию. Скажите cap.set (cv2.CAP_PROP_POS_MSEC, 5000) # перед первым cap.read (). Я обновлю свой ответ, если хотите.

delephin 18.09.2018 14:32

Другие вопросы по теме