Создайте 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
).
- Как проверить статус или убить внешний процесс с помощью python
- Как закончить вход sys.stdin.readlines ()?
- Поиск приложения GUI для ввода команд Linux
- Как подклассы str в Python
- Простой сетевой обмен сообщениями python
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])
- Как избежать замораживания GUI при связывании скрипта muliprocessing python, связанного с gui (скрипт python должен работать в фоновом режиме)
- Проблемы с просмотром PDF-файлов
- Настроить тип параметра функции в Python?
- Как документировать и тестировать интерфейсы, необходимые для формальных параметров в Python 2?
- Широко используется пакет «zope»?
- Оберните несколько C-источников (файлы .c), чтобы использовать их функции в Python, используя SWIG
- Почему pylint продолжает говорить, что мой класс R0923 – «интерфейс не реализован»
- Рекурсивные определения классов в Python
- Как показать интерфейс для выбора точек в python?