如何使用Python API一次(或几乎)使用OpenCV从两个或多个摄像头捕获视频?
我有三个网络摄像头,都具有视频流功能,位于/ dev/video0,/ dev/video1和/ dev/video2.
以教程为例,从单个摄像头捕获图像就是:
import cv2
cap0 = cv2.VideoCapture(0)
ret0, frame0 = cap0.read()
cv2.imshow('frame', frame0)
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)
这很好用.
但是,如果我尝试初始化第二个摄像头,尝试read()从它返回None:
import cv2
cap0 = cv2.VideoCapture(0)
cap1 = cv2.VideoCapture(1)
ret0, frame0 = cap0.read()
assert ret0 # succeeds
ret1, frame1 = cap1.read()
assert ret1 # fails?!
Run Code Online (Sandbox Code Playgroud)
为了确保我不会意外地给OpenCV一个坏的相机索引,我单独测试了每个相机索引,它们都是自己工作的.例如
import cv2
#cap0 = cv2.VideoCapture(0)
cap1 = cv2.VideoCapture(1)
#ret0, frame0 = cap0.read()
#assert ret0
ret1, frame1 = cap1.read()
assert ret1 # now it works?!
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
编辑:我的硬件是运行Ubuntu的Macbook Pro.在Macbook上专门研究这个问题,我发现其他人也遇到过这个问题,无论是在OSX上还是在不同类型的摄像头上.如果我访问iSight,我的代码中的两个调用都会失败.
我想从网络摄像头拍摄视频,在帧上渲染一些文本并进行一些运动跟踪并将其传递给虚拟网络摄像头,以便可以轻松地进行流式传输.
我在stackoverflow上找到了一些答案,表明我应该使用DirectShow.根据DirectShow文档中的信息,DirectShow SDK是Windows SDK的一部分.所以我安装了最新的Windows SDK,但似乎它不包括DirectShow,因为下面没有DirectShow示例C:\Program Files (x86)\Microsoft SDKs\Windows.(stackoverflow的答案也相当古老 - 大约在2010年左右)
您能否建议一种方法使DirectShow工作(包括在Visual Studio 2015上运行的示例)或DirectShow的其他替代方法,这将有助于我创建虚拟网络摄像头?
我的 PC 上连接了多个网络摄像头,我想根据其信息(名称、分辨率等)选择一台摄像头。有没有办法列出 PC 上可用的所有摄像机,而不是尝试 cv2.VideoCapture() 中的所有索引?
我正在尝试用 java 创建新的相机源或驱动程序。基于 python 有一个类似的问题。我想做的是,我希望在 Windows 中显示一个新的相机源,以便所有应用程序都可以连接到它。输出将是循环显示的许多图像,而不是实时摄像机。我可以用java实现这个吗?如果是的话怎么办?stackoverflow上有很多基于c++的问题。但不是关于 Java 的。我正在尝试用 Java 来实现这一点。我认为为此我需要使用像 directX 这样的东西。
我知道如何创建图像循环。但是如何创建相机源呢?
camera ×2
opencv ×2
python ×2
directshow ×1
driver ×1
java ×1
java-17 ×1
opencv4 ×1
python-3.7 ×1
webcam ×1
winapi ×1
windows-10 ×1