首页 > 解决方案 > 如何在python中将多个摄像头馈送流式传输到单个套接字

问题描述

我正在开发一个模块,我必须在其中检测视频流中的一些预定义对象。对于对象检测,我使用的是 YOLO。我需要并行处理多个相机馈送。如this answer中所述,我尝试在python中使用多线程套接字。但它无法同时处理多个客户端。没有套接字,我只是尝试在 python 中使用线程。

from concurrent.futures import ThreadPoolExecutor
import threading
import random
import cv2
from detection_image import get_detected_object
import numpy as np
import time

def task(video_file):
    time.sleep(5)
    cap = cv2.VideoCapture(video_file)
    while True:    
        cap.set(1, frame_num)
        ret, frame = cap.read()
        ## Method to detect object in current frame.
        result = get_detected_object(frame)

def main():
    executor = ThreadPoolExecutor(max_workers=2)
    task1 = executor.submit(task("1.mp4"))
    task2 = executor.submit(task("2.mp4"))

if __name__ == '__main__':
    main() 

但这似乎也不起作用。我正在考虑为每个相机创建单独的套接字并分别处理流。这是正确的做法吗?或者如果多线程方法是正确的,我该如何实现?

有人可以建议吗?

标签: pythonmultithreadingopencv

解决方案


为多个摄像头创建多个插槽不是一个很好的方法,除非它是实际需要。如果只是线程适用于您的项目,那么您可以这样做。

from concurrent.futures import ThreadPoolExecutor
import threading
import random
import cv2
from detection_image import get_detected_object
import numpy as np

def task():
   executor = ThreadPoolExecutor(max_workers=2)  

   cap1 = cv2.VideoCapture("1.mp4")
   cap2 = cv2.VideoCapture("2.mp4")

   while True:
       _, frame1 = cap1.read()
       _, frame2 = cap2.read()
       task1 = executor.submit(get_detected_object(frame1, COLORS, classes, net))
       task2 = executor.submit(get_detected_object(frame2, COLORS, classes, net))


if __name__ == '__main__':
   task()

opencv 的 VideoCapture 是同步的,所以我们不能在 VideoCapture 级别上进行线程化。因此,您可以在“read()”函数级别创建线程,而不是为每个视频文件创建线程,这可以正常工作。

希望这会有所帮助:)


推荐阅读