opencv 拉取视频流

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()

你可能感兴趣的:(opencv 拉取视频流)