从界面名称而不是摄像机编号

时间:2016-03-06 00:47:57

标签: python opencv interface udev

创建视频捕捉的正常方法是:

cam = cv2.VideoCapture(n)

其中n对应/dev/video0dev/video1

的数量

但是因为我正在构建一个使用多个摄像头来处理不同事物的机器人,我需要确保它被分配给正确的摄像头,我创建了udev规则,创建了带有符号链接到正确端口的设备。插入了特定的相机。

它们似乎正在工作,因为当我查看/dev目录时,我可以看到链接:

/dev/front_cam -> video1

但是我现在不确定如何实际使用它。

我以为我可以从文件名中打开它,好像它是一个视频,但是cam = cv2.VideoCapture('/dev/front_cam')不起作用。

cv2.VideoCapture('/dev/video1')

也不是

它不会抛出错误,它会返回一个VideoCapture对象,而不是一个已打开的对象(cam.isOpened()返回False)。

5 个答案:

答案 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