在python-opencv中列出可用设备
我有两台摄像头连接在我的笔记本电脑上(一个是内置的),这两台摄像头都能正常工作。(如果我用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中能够正常工作:
目前,没有办法提取摄像头的数量,相关的功能请求可以在这里查看: