Сколько USB-камер доступно на одном ПК?

Мне просто интересно, сколько USB-камер доступно на одном настольном ПК? Есть ли предел? Я планирую создать свое собственное приложение для Windows (с использованием.NET) для захвата около 10 USB-камер, которые подключены к моему настольному ПК. Это возможно?

4 ответа

Проблема не в том, сколько вы можете обнаружить. На одной шине USB возможно ~127.

Но шина USB может передавать только ограниченное количество байтов в секунду. Поэтому, если вы хотите использовать более одного, вам нужно рассчитать величину полосы пропускания, которая у вас есть для видеопотока.

Пример: шина USB обычно может выдавать реалистично ~35 МБ / с. 640*480*2 байта на пиксель => 614400 байтов на кадр. @30 FPS это ~17 МБ / с, поэтому вы можете использовать 2 камеры одновременно с этой настройкой.

Если это на самом деле, см. Код для подключения 5 камер к одному компьютеру (процессорное ядро ​​i3, оперативная память 8 ГБ!!!), вам нужно подключить все камеры к USB-портам только на вашем компьютере!!! git hub link

Немного поздно, извините:) Я обнаружил, что одна USB-карта ограничена пропускной способностью USB. но... если вы добавите USB-карты в PCI, вы можете получить больше камер, но... большинство поставщиков не утруждают себя изменением адреса USB-карты, который видит компьютер, поэтому вам нужно покупать карты USB-PCI у разных поставщиков и попытать счастья. У меня была такая же проблема с FireWire. вот мой код для Python. (спасибо другим программистам в stackru)

# show multiple usb cameras

import os
import cv2
import threading
import time
import datetime

#font for image writing
font = cv2.FONT_HERSHEY_SIMPLEX
fontScale = 1
fontColor = (255,180,180)
lineType = 2

SaveImage = True # if true save images
duration = [100,100,100,10,10] # time between image saves in sec
IMAGESAVEPATH = "C:/tmp/pix" # path for camera to store image to

ShowText = True #Show text on image - text will be  saved with the image

#camera thread. here me make a thread and its functions
class camThread(threading.Thread):
def __init__(self, previewName, camID):
    threading.Thread.__init__(self)
    self.previewName = previewName
    self.camID = camID
def run(self):
    print ("Starting " + self.previewName)
    camPreview(self.previewName, self.camID)

#camera main loop - here we init the specific camera and start it then have a             window to show the image and we store the image to the right directory
def camPreview(previewName, camID):
    cv2.namedWindow(previewName)
cam = cv2.VideoCapture(camID) #start the camera (the cameras are numbered by the         order they are connected to the computer)
if cam.isOpened():  # try to get the first frame
    cam.set(3,4000)    #this will bring the largest frame set    
    cam.set(4,4000)
    cam.set(5,1) #fps
    time.sleep(2)
    cam.set(15, -1.0)
    rval, frame = cam.read() #read the image
else:
    rval = False

TStart = time.time() # time  for next image
mpath = os.path.join(IMAGESAVEPATH, str(camID)) #make sure the directory we save in exists, otherwise make it
print("try to make dir ", mpath, " T " , time.time())
if not os.path.exists(mpath):
    os.makedirs(mpath)
    
    cv2.namedWindow(previewName, cv2.WINDOW_NORMAL)

while rval: #if we get an image
    height, width, channels = frame.shape
    if ShowText: # write text on the image
        caption = str(camID) + " - " + str(height) + " " + str(width) + " "
        cv2.putText(frame,str(caption),(20,20),font, fontScale, fontColor, lineType)
    cv2.imshow(previewName, frame) # show image in its window
    #cv2.resizeWindow(previewName, 1280,960) # resize all windows removed ofer
    rval, frame = cam.read() #raed next image
    key = cv2.waitKey(20) 
    if key == 27:  # exit on ESC
        print("key pressed ", camID)
        break
    
    TDiff = int(time.time() - TStart) # time difference from last image
    if (SaveImage and TDiff > duration[camID]): # Save if time passed
        file_name = os.path.join(mpath, "T{:%Y.%m.%d %H-%M-%S}.jpg".format(datetime.datetime.now())) # make file name string
        cv2.imwrite(file_name, frame) 
        print("\rsaved to : ", file_name)
        TStart = time.time() #reset time to next image
        
    cv2.destroyWindow(previewName)

# Create 5 threads as follows
thread1 = camThread("Camera 1", 0)
thread2 = camThread("Camera 2", 1)
thread3 = camThread("Camera 3", 2)
thread4 = camThread("Camera 4", 3)
thread5 = camThread("Camera 5", 4)
thread1.start()
thread2.start()
thread3.start()
thread4.start()
thread5.start()

Максимальное ограничение для USB-устройств, подключенных к одному хосту - 127. Таким образом, вы можете подключить до 100+ устройств, и они будут работать нормально (100+ - потому что концентратор также является активным устройством и имеет собственный адрес).

Возможно, вы пытаетесь получить доступ к первой (уже активной) камере, и программа не работает, потому что камера уже заблокирована?

[Изменено]

На самом деле, см. Эту статью, которая объясняет: Получить список подключенных USB-устройств

Я не уверен, что есть максимум. Я проверю и отправлю обратно, если узнаю.

[Дальнейшее редактирование]

Не могу найти документированный максимум. Теоретически ManagementObjectCollection должен быть в состоянии держать миллионы объектов в нем. Если вы столкнулись с проблемами (в чем я сомневаюсь с 10 устройствами), вы можете просто предварительно выделить размер коллекции при создании экземпляра.

Я только что провел тест и могу подключить более 10 USB-устройств через концентратор. Вы должны быть в порядке.

Другие вопросы по тегам