Я хочу отображать видеопотоки с нескольких камер в одном окне. В настоящее время я работаю над реализацией с Python и OpenCV.
В настоящее время у меня есть 4-5 камер, видеопоток которых я хочу отобразить в окне. Камеры разных производителей, и некоторые из них имеют разное разрешение.
Моя текущая проблема заключается в том, что видео частично останавливаются (камеры записывают метку времени в видео). Похоже, что только видео, которое обрабатывается дальше из-за разрешения, работает нормально без остановки. Для других видео я думаю, что отметка времени увеличивается случайным образом, но всегда на одну секунду.
Вот мой текущий исходный код:
import cv2 as cv
import numpy as np
import queue
import threading
import time
vcap1_data_queue = queue.Queue()
vcap2_data_queue = queue.Queue()
vcap3_data_queue = queue.Queue()
vcap4_data_queue = queue.Queue()
condition = threading.Condition()
class video_handler():
def __init__(self, name, videosource, condition, data_queue):
self.name = name
self.videosource = cv.VideoCapture(videosource)
self.condition = condition
self.data_queue = data_queue
def read_videostream(self):
while True:
ret1, frame1 = self.videosource.read()
self.inputqueue_return.put(ret1)
self.data_queue.put(frame1)
video1 = video_handler("Test1","<RTSP_Address1>", condition, vcap1_data_queue)
video1_thread = threading.Thread(target=video1.read_videostream)
video1_thread.start()
video2 = video_handler("Test2", "RTSP_Address2", condition, vcap2_data_queue)
video2_thread = threading.Thread(target=video2.read_videostream)
video2_thread.start()
video3 = video_handler("Test3","RTSP_Address3", condition, vcap3_data_queue)
video3_thread = threading.Thread(target=video3.read_videostream)
video3_thread.start()
video4 = video_handler("Test4","RTSP_Address4", condition, vcap4_data_queue)
video4_thread = threading.Thread(target=video4.read_videostream)
video4_thread.start()
while(1):
try:
if not vcap1_data_queue.empty():
frame1 = vcap1_data_queue.get()
if not vcap2_data_queue.empty():
frame2 = vcap2_data_queue.get()
if not vcap3_data_queue.empty():
frame3 = vcap3_data_queue.get()
if not vcap4_data_queue.empty():
frame4_small = vcap4_data_queue.get()
height, width, channels = frame3.shape
frame4 = np.zeros((height,width,3), np.uint8)
frame4[0:frame4_small.shape[0], 0:frame4_small.shape[1]]= frame4_small
numpy_horizontal_concat1 = np.concatenate((frame1, frame2), axis=1)
numpy_horizontal_concat2 = np.concatenate((frame3, frame4), axis=1)
frame = np.concatenate((numpy_horizontal_concat1, numpy_horizontal_concat2), axis=0)
cv.imshow('VIDEO', frame)
cv.waitKey(1)
except Exception as e:
print(str(e))
В чем может быть моя ошибка? Большое спасибо за вашу помощь!