如何在for循环中制作视频捕获流以流式传输多个摄像机

How to make videocapture stream in a for loop to stram multiple cameras

我正在尝试制作这个视频捕捉 opencv2 python 脚本允许我从我的笔记本电脑摄像头和 USB 摄像头进行多个视频流,我成功地(在 youtube 的帮助下)只在每次添加时这样做一个相机我必须编辑代码行并添加另一个视频捕获行和另一个帧和另一个 cv2.imshow。但我想以一种允许我流式传输检测到的尽可能多的摄像机的方式编辑视频捕获代码,而无需在每次有使用循环的摄像机时添加一行。我显然是新来的,如果解决方案太简单,请接受我的歉意。

这是允许我流式传输多个摄像头但为每个摄像头添加一行的代码。

import urllib.request
import time
import numpy as np
import cv2

# Defining URL for camera
video_capture_0 = cv2.VideoCapture(0)
video_capture_1 = cv2.VideoCapture(1)

while True:
    # Capture frame-by-frame
    
    ret0, frame0 = video_capture_0.read()
    ret1, frame1 = video_capture_1.read()
    

    if (ret0):
        # Display the resulting frame
        cv2.imshow('Cam 0', frame0)

    if (ret1):
        # Display the resulting frame
        cv2.imshow('Cam 1', frame1)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything is done, release the capture
video_capture_0.release()
video_capture_1.release()
cv2.destroyAllWindows()

我尝试制作一个列表 camlist = [i for i in range(100)],然后将其添加到一个 for 循环中,该循环不断将其添加到视频捕获中。但我认为那是一团糟所以我删除了代码加上看起来不太有效。

如果你想使用很多相机,那么首先你应该把它们放在列表中 - 然后你可以使用 for-loop 来获取所有帧。您还应该将框架保留在列表中,以便稍后您可以使用 for-loop 来显示它们。最后你可以使用 for-loop 来释放相机

import cv2

#video_captures = [cv2.VideoCapture(x) for x in range(2)]

video_captures = [
    cv2.VideoCapture(0),
    #cv2.VideoCapture(1),
    cv2.VideoCapture('https://imageserver.webcamera.pl/rec/krupowki-srodek/latest.mp4'),
    cv2.VideoCapture('https://imageserver.webcamera.pl/rec/krakow4/latest.mp4'),
    cv2.VideoCapture('https://imageserver.webcamera.pl/rec/warszawa/latest.mp4'),
]    

while True:
 
    results = []
    for cap in video_captures:   
        ret, frame = cap.read()
        results.append( [ret, frame] )

    for number, (ret, frame) in enumerate(results):
        if ret:
            cv2.imshow(f'Cam {number}', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

for cap in video_captures:   
    cap.release()

cv2.destroyAllWindows()

现在,即使您将新相机添加到列表中,也无需更改其余代码。


但对于许多相机来说,最好 运行 每个相机都在单独的线程中 - 但仍将所有相机都放在列表中。


几天前的问题: