Создайте openCV VideoCapture из имени интерфейса вместо номеров камер

Обычный способ создания видеозахвата – это:

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 ).

 import re import subprocess import cv2 import os device_re = re.compile("Bus\s+(?P<bus>\d+)\s+Device\s+(?P<device>\d+).+ID\s(?P<id>\w+:\w+)\s(?P<tag>.+)$", re.I) df = subprocess.check_output("lsusb", shell=True) for i in df.split('\n'): if i: info = device_re.match(i) if info: dinfo = info.groupdict() if "Logitech, Inc. Webcam C270" in dinfo['tag']: print "Camera found." bus = dinfo['bus'] device = dinfo['device'] break device_index = None for file in os.listdir("/sys/class/video4linux"): real_file = os.path.realpath("/sys/class/video4linux/" + file) print real_file print "/" + str(bus[-1]) + "-" + str(device[-1]) + "/" if "/" + str(bus[-1]) + "-" + str(device[-1]) + "/" in real_file: device_index = real_file[-1] print "Hurray, device index is " + str(device_index) camera = cv2.VideoCapture(int(device_index)) while True: (grabbed, frame) = camera.read() # Grab the first frame cv2.imshow("Camera", frame) key = cv2.waitKey(1) & 0xFF 

Сначала найдите нужную строку в списке USB-устройств. Получите номер BUS и DEVICE.

Найдите символическую ссылку в каталоге video4linux. Извлеките индекс устройства из realpath и передайте его методу VideoCapture.

Вместо предлагаемого решения я нашел более короткий, который немного взломан.

Я просто посмотрю, где символическая ссылка указывает, найдите в ней целое число и затем используйте это.

 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])