我的笔记本电脑连接了两个网络摄像头(一个内置),两个都可以工作。 (如果我使用Cheese,Ubuntu附带的网络摄像头,它使用外部的)。如果我使用
cap = cv.CreateCameraCapture(0)
或
cap = cv.CreateCameraCapture(-1)
我的内置网络摄像头。如果我使用
cap = cv.CreateCameraCapture(1)
它没有工作,而且对象是'cap'显示为:
<Capture (nil)>
与CaptureFromCAM相同。因此,我想知道openCV正在尝试做什么以及为什么它似乎不知道第二台相机。应该有两个设备可用(两者都有/ dev / videoN条目)。
答案 0 :(得分:10)
@Patrick的回答很好,但我想对此加以改进,目前无法发表评论。
我认为Patricks设置假定摄像机之间没有空索引。但是在我的情况下,我的内置摄像头位于索引0,USB网络摄像头位于索引2。因此,“如果不是cap.read()[0]”从索引1的while循环中跳出,则不会捕获其他的。我们必须指定愿意检查的索引数量,而不是不添加空索引。
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的排版!
答案 1 :(得分:8)
这是OpenCV的一般问题,如下所示。似乎只有内置或第一个USB凸轮(只有你没有构建凸轮)才能在OpenCV中运行:
How to use a camera with OpenCV
Cannot access usb webcam through OpenCV, Cygwin
OpenCV capture from USB not iSight (OSX)
目前,无法提取此功能请求中列出的摄像机数量:
答案 2 :(得分:2)
我可以通过遍历网络摄像头索引直到读取该摄像头不再返回任何内容来解决此问题:
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
此方法返回所有索引的列表,这些索引在读取时返回某些内容;我敢肯定它可以改进,但是几乎没有几个网络摄像头,而且运行起来很快。
答案 3 :(得分:0)
我认为您应该尝试以下操作:
import cv2
cap = cv2.VideoCapture(1)
while True:
_, frame = cap.read()
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
答案 4 :(得分:0)
对于Windows,您可以构建.pyd扩展名。 https://github.com/yushulx/python-capture-device-list
还没有一种简单的跨平台方式;理想情况下,有人为每个操作系统整理一个解决方案,然后将它们构建到.pyd中。
答案 5 :(得分:-1)
我相信在Linux下,视频输入的有效索引是/ dev目录中videoN设备的编号。 因此,以下内容将给出有效索引的列表:
import os
devs = os.listdir('/dev')
vid_indices = [int(dev[-1]) for dev in devs
if dev.startswith('video')]
vid_indices = sorted(vid_indices)
vid_indices