opencv拉取视频流

    技术2022-07-11  104

    import os,sys import gc import multiprocessing as mp import numpy as np import cv2 import time

    def write(stack, cam, top: int) -> None:     print('Process to write: %s' % os.getpid())     cap = cv2.VideoCapture(cam)     while True:         t = time.time()         _, img = cap.read()         if _:             #print(type(img))             stack.append((t, img))             #print('inininininininin ........... ')             # 每到一定容量清空一次缓冲栈             # 利用gc库,手动清理内存垃圾,防止内存溢出             if len(stack) >= top:                 del stack[::2]                 gc.collect()

    def run(stack_1,stack_2,stack_4,stack_34) -> None: #提醒返回值是一个None     print('Process to read: %s' % os.getpid())     while True:         # print("正在读取第%d帧:" %index)         frame=np.zeros((960,1280,3),dtype=np.uint8)         if len(stack_4) >= 5 and len(stack_34) >= 5 and len(stack_1) >= 5 and len(stack_2) >= 5:         #if len(stack_1) >= 5 and len(stack_2) >= 5:             temp4 = stack_4.pop(0)             temp34 = stack_34.pop(0)             temp1 =stack_1.pop(0)             temp2=stack_2.pop(0)             frame_batch = [temp4[1], temp34[1],temp1[1],temp2[1]]             #print(temp4[1].shape)             frame4=cv2.resize(temp4[1],(int(640),int(480)),interpolation=cv2.INTER_CUBIC)             frame34=cv2.resize(temp34[1],(int(640),int(480)),interpolation=cv2.INTER_CUBIC)             frame1=cv2.resize(temp1[1],(int(640),int(480)),interpolation=cv2.INTER_CUBIC)             frame2=cv2.resize(temp2[1],(int(640),int(480)),interpolation=cv2.INTER_CUBIC)             #frame_up=np.hstack((frame1,frame2))             #frame_down=np.hstack((frame4,frame34))             #frame=np.hstack((frame_up,frame_down))             #cv2.imshow('video',temp4[1])             frame[0:480, 0:640, :] = frame4             frame[0:480, 640:1280, :] = frame34             frame[480:960, 0:640, :] = frame1             frame[480:960, 640:1280, :] = frame2             cv2.imshow('video',frame)             cv2.waitKey(1)         else:             continue

           if __name__ == '__main__':     # 父进程创建缓冲栈,并传给各个子进程:     #mp.set_start_method('spawn')     q_1 = mp.Manager().list()     q_2 = mp.Manager().list()     q_4 = mp.Manager().list()     q_34 = mp.Manager().list()     pw_1 = mp.Process(target=write, args=(q_1, "填写地址", 100))     pw_2 = mp.Process(target=write, args=(q_2, "填写地址", 100))     pw_4 = mp.Process(target=write, args=(q_4, "填写地址", 100))     pw_34 = mp.Process(target=write, args=(q_34, "填写地址", 100))     #pr = mp.Process(target=run, args=(q_34,))     pr = mp.Process(target=run, args=(q_1,q_2,q_4,q_34,))     pw_1.start()     pw_2.start()     pw_4.start()     pw_34.start()     pr.start()     pr.join()

        pw_1.terminate()     pw_2.terminate()     pw_4.terminate()     pw_34.terminate()

    Processed: 0.010, SQL: 9