一台PC可以访问多少个USB摄像头

时间:2012-04-20 03:29:45

标签: c# .net camera usb pc

我只是想知道一台台式电脑可以访问多少USB摄像头?有限制吗?我打算创建自己的Windows应用程序(使用.NET)来捕获大约10台连接到台式PC的USB摄像头。这可能吗?

5 个答案:

答案 0 :(得分:16)

问题不在于您能发现多少。在单个USB总线上,可以使用~127。

但是,USB总线每秒只能传输有限的字节数。因此,如果您想要使用多个,则必须计算视频流的带​​宽量。

示例: USB总线通常可以实际提供~35 MB / s。每像素640 * 480 * 2字节=>每帧614400字节。 @ 30 FPS这是~17 MB / s,因此您可以使用此设置同时使用2个摄像头。

答案 1 :(得分:1)

如果真的如此,请参阅将5个摄像头连接到一台计算机(处理器核心i3,8gb ram !!!)的代码,您需要将所有摄像头连接到仅在您的计算机上的USB端口! git hub link

答案 2 :(得分:0)

[被修改]

实际上,请参阅此文章解释: Get List of connected USB Devices

我不确定是否有最大值。如果我发现,我会检查并回复。

[进一步编辑]

找不到记录的最大值。从理论上讲,ManagementObjectCollection应该能够容纳数百万个对象。如果遇到问题(我怀疑有10个设备),你可以在实例化时预先分配集合大小。

我刚刚进行了测试,我可以通过集线器接收超过10个USB设备。你应该没事。

答案 3 :(得分:0)

连接到一台主机的USB设备的最大限制 - 127.因此,您可以连接多达100多台设备,它们可以正常工作(100+ - 因为集线器也是有源设备并且拥有自己的地址)。

可能,您尝试访问第一个(已经激活的)摄像头并且程序失败,因为摄像头已经锁定了?

答案 4 :(得分:0)

有点晚了抱歉:) 我发现,单个USB卡受USB带宽限制。但.. 如果您在PCI上添加USB卡,则可以获得更多相机,但是... 大多数供应商不会费心更改计算机看到的USB卡地址,因此您需要从其他供应商处购买USB到PCI卡并尝试好运。 我在使用火线时遇到了同样的问题。 这是我的python代码。 (感谢其他程序员进行stackoverflow)

# 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()