【问题标题】:How to make videocapture stream in a for loop to stram multiple cameras如何在 for 循环中制作视频捕获流以流式传输多个摄像机
【发布时间】:2021-01-30 13:42:04
【问题描述】:

我正在尝试让这个 videocapture 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 循环中。但我认为那是一团糟,所以我删除了似乎不太有效的代码。

【问题讨论】:

  • 要做到这一点,看来还需要其他工具。如果只想使用 python 和 opencv,则必须始终循环控制摄像机,这不是一个好方法(此循环可以是线程)。如果您确实需要这样做,您应该使用新工具在免费中同步检查相机连接。
  • 您应该使用list 来保留摄像头,然后您可以使用for-loop 来处理所有摄像头。您应该将ret,frame 添加到列表中,以便稍后您可以使用另一个for-loop 来处理所有结果。最后你可以使用for-loop torelease()所有相机。然后您可以将新相机添加到列表中,而无需更改代码。

标签: python numpy loops opencv video-streaming


【解决方案1】:

如果您想使用多个相机,那么首先您应该将它们保留在列表中 - 然后您可以使用 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()

现在,如果您将新相机添加到列表中,则无需更改其余代码。


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


前几天有人提问:How display multi videos with threading using tkinter in python?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多