2016-03-06 4 views
4

Обычный способ создания VideoCapture заключается в следующем:Создание OpenCV VideoCapture от имени интерфейса вместо номеров камер

cam = cv2.VideoCapture(n)

где п соответствует числу /dev/video0, dev/video1

Но так как я m строя робота, который использует несколько камер для разных вещей, мне нужно было убедиться, что он был назначен правильной камере, я создал правила udev, которые создали устройства с символическими ссылками на правильный порт всякий раз, когда была подключена конкретная камера.

Они, кажется, работает, потому что, когда я смотрю в каталог /dev я могу увидеть ссылку:

/dev/front_cam -> video1

Однако я не знаю, как на самом деле использовать это сейчас.

Я думал, что могу просто открыть его из имени файла, как если бы это было видео, но cam = cv2.VideoCapture('/dev/front_cam') не работает.

Ни делает cv2.VideoCapture('/dev/video1')

Он не бросает ошибку, она возвращает объект видеозахвата, только не один, который открыл (cam.isOpened() возвращается False).

+0

Вы можете прочитать символическую ссылку из своей программы, чтобы программно вывести строку '/ dev/video1'? Если да, можете ли вы извлечь номер из этой строки (1) и отправить его в объект захвата openCV? – Micka

+1

Я одобрил ваш вопрос, хороший вопрос, я думаю. – mertyildiran

ответ

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

1

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

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

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