Мульти-обработка Python с помощью RTSP Feed - PullRequest
0 голосов
/ 30 сентября 2019

Я новичок в python и только что привык к многопоточности - мне удалось создать мой первый скрипт, который хорошо работает, но он выполняет задания вместо того, чтобы запускать их одновременно.

По сути, я открываю домашнюю систему видеонаблюденияПодача камер - у меня есть 5 камер, но поскольку они открываются в потоках, они показывают изображения только каждую секунду. Я исследовал и думаю, что мне нужно использовать многопроцессорность, а не многопоточность.

Вот мой существующий код, который использовал многопоточность - с удалением некоторых дополнительных частей:

from threading import Thread
import imutils
import cv2, time
import argparse
import numpy as np
import datetime
import time

from multiprocessing import Process

camlink1 = "rtsp://link1"
camlink2 = "rtsp://link2"
camlink3 = "rtsp://link3"
camlink4 = "rtsp://link4"
camlink5 = "rtsp://link5"

class VideoStreamWidget(object):
    def __init__(self, link, camname, src=0):
        self.capture = cv2.VideoCapture(link)
        self.capture.set(cv2.CAP_PROP_FPS, 2)


        # Start the thread to read frames from the video stream
        self.thread = Thread(target=self.update, args=())
        self.thread.daemon = True
        self.thread.start()
        self.camname = camname
        self.link = link


    def update(self):
        # Read the next frame from the stream in a different thread
        while True:
            if self.capture.isOpened():
                (self.status, self.frame) = self.capture.read()

    def show_frame(self):

        try:

            # Display frames in main program
            frame = self.frame
            (h, w) = frame.shape[:2]

            cv2.imshow('Frame ' + self.camname, frame)
            key = cv2.waitKey(1)

            if key == ord('q'):
                self.capture.release()
                cv2.destroyAllWindows()
            exit(1)     
            time.sleep(.05)
        except AttributeError:
            print("[ISSUE] Problem with " + self.camname + "...")
            self.capture = cv2.VideoCapture(self.link)
            print("[INFO] Reconnected with " + self.camname + "...")
            pass

if __name__ == '__main__':
    video_stream_widget = VideoStreamWidget(camlink1,"Cam1")
    video_stream_widget2 = VideoStreamWidget(camlink2,"Cam2")
    video_stream_widget3 = VideoStreamWidget(camlink3,"Cam3")
    video_stream_widget4 = VideoStreamWidget(camlink4,"Cam4")
    video_stream_widget5 = VideoStreamWidget(camlink5,"Cam5")

    while True:
        video_stream_widget.show_frame()
        video_stream_widget2.show_frame()
        video_stream_widget3.show_frame()
        video_stream_widget4.show_frame()
        video_stream_widget5.show_frame() 

Как вы можете видетьвнизу я создаю 5 разных "video_stream_widget", но я не делаю этого, это лучшая практика. Может кто-нибудь помочь мне подсказать, как я мог изменить этот код так, чтобы он использовал многопроцессорность, а не многопоточность?

Я пробовал базовый подход к изменению «потока» на «процесс», но это не сработало.

Спасибо, Крис

...