我正在研究一个模块,我必须在其中检测视频流中的一些预定义对象。对于对象检测,我正在使用 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(("函数级别创建线程,而不是为每个视频文件创建线程,这工作正常。
希望这对:)有所帮助