首页 > 解决方案 > 来自多个摄像头的 OpenCV 多线程捕获

问题描述

我正在开发一个使用 OpenCV4 (python3) 和多个摄像头进行多线程捕获的安全项目。每个相机(帧)单独处理以进行对象检测,最后将它们流式传输到网络。由于python没有“案例”而且我正在这样做,它是正确的方法还是优化的方法是什么?

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

标签: pythonopencv

解决方案


推荐阅读