创建视频捕捉的正常方法是:
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
)。
答案 0 :(得分:2)
我的video4linux每个设备都创建2个设备节点。例如,/dev/video0
和/dev/video1
都与我的内部网络摄像头有关。当我插入第二个USB网络摄像头时,/dev/video2
和/dev/video3
都会出现。但是,我只能使用每对中编号较低的设备进行视频捕获(即/dev/video0
和/dev/video2
)。
我用udevadm monitor
看着设备到达,然后用udevadm info --path=$PATH_FROM_UDEVADM_MONITOR --attribute-walk
检查了每个摄像头设备。用于视频捕获的设备具有ATTR{index}=="0"
。
也许不用打开/dev/video1
,而只需打开/dev/video0
:
cam = cv2.CaptureVideo("/dev/video0")
答案 1 :(得分:1)
$ sed -i '/.*[a-z].*/d' sample.log
首先在USB设备列表中搜索所需的字符串。获取BUS和DEVICE号码。
在video4linux目录下找到符号链接。从realpath中提取设备索引并将其传递给VideoCapture方法。
答案 2 :(得分:1)
而不是建议的解决方案我找到了一个较短的解决方案,感觉有点hacky。
我只看一下符号链接指向的位置,找到其中的整数,然后使用它。
import subprocess
cmd = "readlink -f /dev/CAMC"
process = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
# output of form /dev/videoX
out = process.communicate()[0]
# parse for ints
nums = [int(x) for x in out if x.isdigit()]
cap = cv2.VideoCapture(nums[0])
答案 3 :(得分:1)
如果您知道相机的型号,则可以在 0,1 --heading
10,5 --set 1
20,3 --set 2
30,15 --set 3
中查找它。我们正在使用HDMI-USB视频转换器,并以如下方式连接到它:
/dev/v4l/by-id/...
这是在将设备名称符号链接到#! /usr/bin/env python
import os
import re
import cv2
DEFAULT_CAMERA_NAME = '/dev/v4l/by-id/usb-AVerMedia_Technologies__Inc._Live_Gamer_Portable_2_Plus_5500114600612-video-index0'
device_num = 0
if os.path.exists(DEFAULT_CAMERA_NAME):
device_path = os.path.realpath(DEFAULT_CAMERA_NAME)
device_re = re.compile("\/dev\/video(\d+)")
info = device_re.match(device_path)
if info:
device_num = int(info.group(1))
print("Using default video capture device on /dev/video" + str(device_num))
cap = cv2.VideoCapture(device_num)
名称之后,然后解析该设备编号的设备。
答案 4 :(得分:0)
其他答案中未探讨的一种可能性是使用/ sys / class / video4linux / video * /目录中的“名称”文件。
示例:
def get_camera(camera_name):
cam_num = None
for file in os.listdir("/sys/class/video4linux"):
real_file = os.path.realpath("/sys/class/video4linux/" + file + "/name")
with open(real_file, "rt") as name_file:
name = name_file.read().rstrip()
if camera_name in name:
cam_num = int(re.search("\d+$", file).group(0))
found = "FOUND!"
else:
found = " "
print("{} {} -> {}".format(found, file, name))
return cam_num
哪个给:
get_camera('HUE')
FOUND! video1 -> HUE HD Pro Camera: HUE HD Pro C
video0 -> HP HD Camera: HP HD Camera