Я хочу обрабатывать многопоточное видео с помощью 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 () этого класса?