У меня есть бесконечный цикл, который читает видеокадры с веб-камеры, и каждый кадр выполняет сложную функцию, требующую высокой вычислительной мощности.Таким образом, при отображении кадров программа будет несколько тормозить из-за кода блокировки.
Что я собираюсь сделать сейчас, так это
- собирать только первые несколько кадров, когда появляется целевой объект
- Поместите их в отдельный поток, чтобы избежать блокировки кода.
Я измерил количество кадров, снимаемых веб-камерой каждую секунду, то есть ~ 28 кадров.Таким образом, каждую секунду цикл while будет собирать только первые 5 кадров, обрабатывать их все в другом потоке и возвращать результат после завершения всех 5 функций.
Я пытался использовать 'Pool' и 'Queue', но не смог заставить его работать, цикл все еще заблокирован.Приведенный ниже код неопределенно представляет, как моя программа выглядит сейчас, будет редактировать ее, когда я вернусь домой, используя телефон, чтобы отправить сообщение сейчас.
def detect(frame):
# detect target object from images
pass
def nn(frame):
# some heavy processing code
pass
count = 0
stack = []
while True:
frame = cv2.imread(0)
detected = detect(frame)
# stop collecting images when collected 5
if detected and count <= 5:
stack.append(frame)
count += 1
# start processing
if len(stack) == 5:
p = Pool(4)
results = p.map(nn, frame)
p.close()
p.join()
# reset
stack = []
count = 0
Правильно ли я понимаю концепцию?Или мне нужно сделать что-то еще, как сопрограмма?