创建视频捕捉的正常方法是:
cam = cv2.VideoCapture(n)
其中n对应于/ dev / video0,dev / video1的编号
但是因为我正在构建一个使用多个摄像头来处理不同事物的机器人,所以我需要确保将它分配给正确的摄像头,我创建了udev规则,只要特定的摄像头是特定摄像头,就会创建带有符号链接的设备.插入.
它们似乎正在工作,因为当我查看/ dev目录时,我可以看到链接:
/ dev / front_cam – >视频1
但是我现在还不确定如何实际使用它.
我以为我可以从文件名中打开它,好像它是一个视频,但是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方法.