如何在 Python 中将多个摄像机源流式传输到单个套接字



我正在研究一个模块,我必须在其中检测视频流中的一些预定义对象。对于对象检测,我正在使用 YOLO。 我需要并行处理多个摄像机源。我尝试在 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() 

但这似乎也行不通。 我正在考虑为每个相机创建单独的插座并单独处理流。这是一种正确的做法吗? 或者如果多线程方法是正确的,我该如何实现?

有人可以建议吗?

除非是实际要求,否则为多个摄像机创建多个套接字不是一个很好的选择。 如果只是线程适用于您的项目,那么您可以这样做。

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(("函数级别创建线程,而不是为每个视频文件创建线程,这工作正常。

希望这对:)有所帮助

最新更新