在python-opencv中列出可用设备

24 投票
7 回答
70464 浏览
提问于 2025-04-17 05:49

我有两台摄像头连接在我的笔记本电脑上(一个是内置的),这两台摄像头都能正常工作。(如果我用Ubuntu自带的一个叫Cheese的摄像头软件,它会使用外置的那台)。如果我使用

cap = cv.CreateCameraCapture(0)

或者

cap = cv.CreateCameraCapture(-1)

我得到的是内置的摄像头。如果我使用

cap = cv.CreateCameraCapture(1)

它就不工作了,显示的对象`cap'是:

<Capture (nil)>

使用CaptureFromCAM也是一样。所以我想知道openCV在做什么,为什么它似乎不知道第二个摄像头。应该有两个设备可以使用(两个都有/dev/videoN的条目)。

7 个回答

26

@Patrick的回答很棒,但我想在此基础上做一些改进,因为我还不能评论。

我觉得Patrick的设置假设摄像头之间没有空的索引。但是在我的情况下,我的内置摄像头在索引0,而USB摄像头在索引2。所以“if not cap.read()[0]”在索引1的时候就跳出了循环,没能检查到其他的摄像头。我们需要指定愿意检查多少个索引,并且只排除那些为空的索引。

def returnCameraIndexes():
    # checks the first 10 indexes.
    index = 0
    arr = []
    i = 10
    while i > 0:
        cap = cv2.VideoCapture(index)
        if cap.read()[0]:
            arr.append(index)
            cap.release()
        index += 1
        i -= 1
    return arr

这样我成功得到了我需要的索引。再次感谢Patrick的布局!

36

我通过一个方法解决了这个问题,就是一个一个地检查摄像头的编号,直到读取摄像头时不再有任何返回值为止:

index = 0
arr = []
while True:
    cap = cv2.VideoCapture(index)
    if not cap.read()[0]:
        break
    else:
        arr.append(index)
    cap.release()
    index += 1
return arr

这个方法会返回一个列表,里面是所有能正常读取的摄像头编号;我相信这个方法可以进一步优化,但通常摄像头的数量不会太多,所以这个方法运行得很快。

14

这是一个关于OpenCV的普遍问题,下面你可以看到。似乎只有内置摄像头或者第一台USB摄像头(前提是你没有内置摄像头)在OpenCV中能够正常工作:

如何在OpenCV中使用摄像头

无法通过OpenCV访问USB网络摄像头,Cygwin

OpenCV无法从USB捕获,而不是iSight(OSX)

目前,没有办法提取摄像头的数量,相关的功能请求可以在这里查看:

https://code.ros.org/trac/opencv/ticket/935

撰写回答