Wenn Sie nur eine Webkamera einfügen möchten, sollten Sie diese normalerweise an / dev / video0
anschließen
$ fswebcam -d /dev/video0 a.jpg
#Oder standardmäßig/dev/Weil es video0 ist
$ fswebcam a.jpg
Wenn es jedoch zwei oder mehr gibt, ist es schwierig zu wissen, welche Kamera / dev / video0 oder 2 ist.
Sie können eine solche Liste mit v4l2-ctl ausgeben.
Beispiel mit raspberryPi
$ v4l2-ctl --list-devices
bcm2835-codec-decode (platform:bcm2835-codec):
/dev/video10
/dev/video11
/dev/video12
bcm2835-isp (platform:bcm2835-isp):
/dev/video13
/dev/video14
/dev/video15
/dev/video16
BUFFALO BSW32KM03 USB PC Camera (usb-20980000.usb-1.3):
/dev/video0
/dev/video1
UVC Camera (046d:0825) (usb-20980000.usb-1.5):
/dev/video2
/dev/video3
Der hier zu beachtende Punkt ist, dass die Kamera so etwas wie "(usb-20980000.usb-1.5)" hat. Und dieser USB-1.5-Teil ist an den physischen USB-Anschluss gebunden ([Referenz] 1).
Wenn Sie also die Webkamera ständig angeschlossen lassen, wird die USB-Nummer dieser Kamera festgelegt. Wenn Sie also den ersten Pfad (/ dev / video *
) verwenden, der darunter geschrieben ist, das Bild der Kamera ([Das andere sind Metadaten?] 2).
require "./video_paths"
VideoPaths.paths # => {"1.3"=>"/dev/video0", "1.5"=>"/dev/video2"}
require "memoist"
require "active_support/core_ext/object/blank"
class VideoPaths
USB_NUMBER_REG = /\.usb\-([\d\.]+)/
class << self
extend Memoist
def paths
new.to_h
end
memoize :paths
end
def initialize
@output = `v4l2-ctl --list-devices`
clean_output
end
def to_h
camera_names.to_h do |camera_name|
key, valid_path, *other_paths = group_by_camera_name[camera_name]
[extract_usb_number(camera_name), valid_path]
end
end
private
attr_reader :output
def group_by_camera_name
key = :not_yet
output.group_by do |line|
key = line if line.end_with?(":")
key
end
end
# BUFFALO BSW32KM03 USB PC Camera (usb-20980000.usb-1.3):
# ^^^^^^^^
def camera_names
group_by_camera_name.keys.select { |key| key.match?(/camera/i) }
end
# BUFFALO BSW32KM03 USB PC Camera (usb-20980000.usb-1.3):
# ^^^^^^^^
def extract_usb_number(camera_name)
camera_name.match(USB_NUMBER_REG)[1]
end
def clean_output
@output = output.lines.collect(&:strip).delete_if(&:blank?)
end
end
Recommended Posts