OpenCV多线程从多个摄像头捕获

2024-10-04 11:33:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在进行一个安全项目,使用OpenCV4(python3)和多个摄像头进行多线程捕获。每个摄像机(帧)分别进行处理,以便进行目标检测,最后将它们流到web。 既然python没有“case”,而我是这样做的,那么它是正确的方法还是优化的方法?你知道吗

<code>
# this is the start function
def start_cams():
    ...
    # get list of active cams
    cam_active = get_camera()  # i.e. 4 cameras
    for i in range(len(cam_active)):
        t = threading.Thread(target=process_cam, name=cam_active[i],
                             args=(cam_active[i],))
        t.daemon = True
        t.start()

# this is the capture and process function
def process_cam(cam_id):
    global lock, vs_cam_1, vs_cam_2, vs_cam_3, vs_cam_4
    global out_1, out_2, out_3, out_4
    ...
    if cam_id == "cam_4":
        vs_cam_4 = VideoProc(source=cam_src, backend=cv2.CAP_FFMPEG).start()
    elif cam_id == "cam_3":
        vs_cam_3 = VideoProc(source=cam_src, backend=cv2.CAP_FFMPEG).start()
    elif cam_id == "cam_2":
        vs_cam_2 = VideoProc(source=cam_src, backend=cv2.CAP_FFMPEG).start()
    elif cam_id == "cam_1":
        vs_cam_1 = VideoProc(source=cam_src, backend=cv2.CAP_FFMPEG).start()
   ...
   # object detection code here
   ...
    with lock:
        if cam_id == "cam_4":
            out_4 = frame.copy()
        elif cam_id == "cam_3":
            out_3 = frame.copy()
        elif cam_id == "cam_2":
            out_2 = frame.copy()
        elif cam_id == "cam_1":
            out_1 = frame.copy()

# this is the output stream function
def generate_stream(cam_id):
    global lock, out_1, out_2, out_3, out_4
    while True:
        with lock:
            if cam_id == "cam_1":
                ...
                # encode the frame in JPEG format
                (flag, encodedFrame) = cv2.imencode(".jpg", out_1)
    ...
    yield(b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n' + \
          bytearray(encodedFrame) + b'\r\n')
</code>

Tags: thesrcidbackendlocksourceoutcv2