Одновременный захват многопотоковых кадров - PullRequest
0 голосов
/ 06 мая 2020

Я хочу обрабатывать многопоточное видео с помощью jetson nano. Я использовал декодер H264 HW для более быстрого декодирования. Этот способ дает два основных преимущества: 1 - более быстрое декодирование для многопотоков, например 8 потоков на 1080p15; 2 - снижение использования ЦП. Моя проблема не в том, как декодировать многопоточность и использовать HW-декодер. и я использовал многопоточность для декодирования кадров с помощью opencv + gstreamer. Эта часть моего проекта работает хорошо. и я одновременно захватываю многопоточные кадры. но у меня две проблемы.

1- Как захватить многопоточность декодированных кадров за одно и то же время? 1.1 - Простое решение может быть от l oop до количества камер. Этот метод захватывает кадры как последовательные. но я хочу знать, могу ли я сбросить какие-либо кадры с этим для l oop, если бы у меня было 8 камер?

2- Как поместить каждый декодированный кадр в свою очередь? Я использовал многопоточность для обработки этой части, я решил учитывать очередь на поток и помещать фрейм в его очередь. Это вызывает у меня проблемы, и мой процесс декодирования становится очень медленным. без очереди обработка - работа. Вот коды моих потоковых камер.

import cv2 
from threading  import Thread 
from time import time, sleep 
from queue import Queue

> class Stream:
>     def __init__(self, url=None, index=0, framerate=15, name=''):
>         self.started = False
>         self.name = name
>         self.index = index
>         self.framerate = framerate
>         self.active = 0
>         self.counter = 0
>         self.thread = None
>         self.url = url
>         self.queue = Queue(100)
>         self.stream = self.rtsp_stream()
>         self.grabbed, self.frame = self.stream.read()

def start(self):
    if self.started:
        print("[INFO] already started!!")
        return None
    self.started = True
    self.thread = Thread(target=self.update, args=(), )
    self.thread.setDaemon(True)
    self.thread.start()

def rtsp_stream(self):
    return cv2.VideoCapture(self.url)


def update(self):
    tic = time()

    while self.stream.isOpened():
        self.grabbed, self.frame = self.stream.read()
        self.queue.put(self.frame)
        print(self.frame.shape)
        if self.grabbed:
            self.active = 1
            if time() - tic > 1:
                print('\n [INFO] Stream {} With FPS = {}'.format(
                    self.index + 1, self.counter+1))
                self.counter = 0
                tic = time()
            else:
                self.counter += 1
            sleep(1. / (self.framerate))
        else:
            self.active = 0
            self.stop()
            return

def read(self):
    return self.queue.get()

def show(self):
    cv2.imshow(self.name, self.read())
    cv2.waitKey(1)

def stop(self):
    self.started = False
    self.thread.join()

def __exit__(self, exc_type, exc_value, traceback):
    self.stream.release()
cams = [] for i in range(params['num_streams']):
    cams.append(
        Stream(url=params['input'], index=i, framerate=params['frame_rate'],
                name='cam{}'.format(i)))
    sleep(0.2)

for cam in cams:
    cam.start()
    sleep(0.2)

while True:
    frames = []
    for i in range(params['num_streams']):
        frames.append(cams[i].read())

Я хочу одновременно захватить кадры потоков и создать баню изображений, а затем передать их в модель глубокого обучения. Для одновременного получения захваченных кадров мне снова нужен многопоточный запуск метода read () этого класса?

...