以前,我曾使用具有以太网连接和不同 IP 地址的工业相机来进行多个相机设置。现在我正在尝试使用 OpenCV 进行多相机设置,但我不确定如何将 OpenCV VideoCaptureID 与特定相机相匹配。
我可能应该用我目前的情况作为例子来使我的问题更清楚。我目前连接了 3 个摄像头。如果重要的话,我正在使用 Ubuntu 18.04。这是我的输出lsusb(省略了除我连接的 3 个 Logitech 网络摄像头之外的所有内容):
$ lsusb
Bus 001 Device 013: ID 046d:0843 Logitech, Inc. Webcam C930e
Bus 001 Device 003: ID 046d:0843 Logitech, Inc. Webcam C930e
Bus 001 Device 006: ID 046d:0892 Logitech, Inc. OrbiCam
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我有 2C930e台和 1 台OrbiCam已连接。基于这篇非常有用的文章:
我发现我可以像这样获取摄像头的序列号:
$ sudo lsusb -v -d 046d:0843 | grep -i serial
iSerial 1 D2DF1D2E
iSerial 1 99A8F15E
$ sudo lsusb …Run Code Online (Sandbox Code Playgroud) 创建视频捕获的正常方法是:
cam = cv2.VideoCapture(n)
其中n对应于的数量/dev/video0,dev/video1
但是,因为我正在构建一个使用多个摄像机来完成不同任务的机器人,所以我需要确保已将其分配给正确的摄像机,所以我创建了udev规则,该规则创建的设备在每次特定摄像机被连接时都具有指向正确端口的符号链接插入。
它们似乎正在工作,因为当我查看/dev目录时,可以看到链接:
/dev/front_cam -> video1
但是我不确定现在如何实际使用它。
我以为可以从文件名中打开它,就好像它是一个视频一样,但是cam = cv2.VideoCapture('/dev/front_cam') 不起作用。
也没有 cv2.VideoCapture('/dev/video1')
它不会引发错误,它会返回一个VideoCapture对象,只是没有打开一个对象(cam.isOpened()返回False)。
我有一个 python 环境(在 Windows 10 上),它使用 OpenCVVideoCapture类连接到多个 USB 摄像头。
据我所知,除了类构造函数/方法device中的参数之外,没有其他方法可以识别 OpenCV 中的特定相机。VideoCaptureopen
问题是设备参数会根据实际连接的摄像头数量和 USB 端口而变化。
我希望能够识别特定的相机并找到其“设备索引”或“相机索引”,无论连接了多少个相机以及连接到哪个 USB 端口。
有人可以建议一种实现该功能的方法吗?python 代码更好,但 C++ 也可以。
我想将焦点锁定在与 OpenCV 一起使用的 USB 网络摄像头上,但如何找到该网络摄像头的属性 ID 号以便进行设置。
我用了
vid = cv2.VideoCapture(2)
for i in range(64):
print(f'ID {i} = {vid.get(i)}')
Run Code Online (Sandbox Code Playgroud)
获取所有值,但我不知道哪个布尔值是哪个。
驱动程序:Realtek Semiconductor Corp. 全高清 1080P 网络摄像头
摄像头:Nextech Autofocus 1080P 高清网络摄像头
ID 0 = 0.0
ID 1 = -1.0
ID 2 = -1.0
ID 3 = 640.0
ID 4 = 480.0
ID 5 = 30.0
ID 6 = 1196444237.0
ID 7 = -1.0
ID 8 = 16.0
ID 9 = 0.0
ID 10 = 0.0
ID 11 = 0.0
ID 12 …Run Code Online (Sandbox Code Playgroud)