python - 如何在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()
但这似乎也不起作用。我正在考虑为每个相机创建单独的套接字并分别处理流。这是正确的做法吗?或者如果多线程方法是正确的,我该如何实现?
有人可以建议吗?
解决方案
为多个摄像头创建多个插槽不是一个很好的方法,除非它是实际需要。如果只是线程适用于您的项目,那么您可以这样做。
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()”函数级别创建线程,而不是为每个视频文件创建线程,这可以正常工作。
希望这会有所帮助:)
推荐阅读
- javascript - 离开或刷新页面时如何弹出自定义模态?
- ios - 按钮 onclick 适用于 android 但不适用于 ios
- javascript - 在不修改原始数组的情况下将数组复制和计算到另一个数组
- keyboard - AQTime 重新映射标准键盘快捷键?
- android - 在 Android Auto 中镜像现有的 android 应用程序
- java - 尝试从 Saucelabs 中的 android 模拟器调用 chrome 浏览器时无法创建新会话?
- elasticsearch - Python elasticsearch-dsl doctype 更新超时
- google-sheets - 将数据从谷歌表格导入谷歌表单
- html - 带有 HAML 的 Rails 中的响应式导航栏
- reactjs - 构建错误发生 webpack 配置