Отображение видео в окне из разных источников RTSP - PullRequest
1 голос
/ 19 января 2020

Я хочу отображать видеопотоки с нескольких камер в одном окне. В настоящее время я работаю над реализацией с 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))


В чем может быть моя ошибка? Большое спасибо за вашу помощь!

...