Вопрос или проблема
Я хочу узнать, есть ли способ извлечь информацию о встроенной веб-камере в моей системе через командную строку Ubuntu.
В основном, я хочу получить угол обзора и фокусное расстояние камеры, чтобы использовать эти данные в другой программе. Эта информация вообще хранится?
Спасибо!
Попробуйте lsusb -v
или lsusb
например:
описание: Видео
продукт: Встроенная веб-камера ноутбука
производитель: OmniVision Technologies, Inc. -2640-07.05.16.3
информация о шине: usb@4:6
версия: 1.00
возможности: usb-2.00
конфигурация: драйвер=uvcvideo максимальная мощность=500mA скорость=480.0MB/s
Вы можете использовать V4L2 API из Python, чтобы получить такие значения, например:
V4L2_CID_EXPOSURE_AUTO (enum v4l2_exposure_auto_type) Включает
автоматические настройки времени экспозиции и/или диафрагмы.
Эффект ручных изменений времени экспозиции или диафрагмы при включенных
этих функциях не определен, драйверы должны игнорировать такие
запросы. Возможные значения:
V4L2_EXPOSURE_AUTO Автоматическое время экспозиции, автоматическая диафрагма.
V4L2_EXPOSURE_MANUAL Ручное время экспозиции, ручная диафрагма.
V4L2_EXPOSURE_SHUTTER_PRIORITY Ручное время экспозиции, автоматическая диафрагма.
V4L2_EXPOSURE_APERTURE_PRIORITY Автоматическое время экспозиции, ручная диафрагма.
И
V4L2_CID_FOCUS_AUTO (boolean) Включает автоматические настройки фокуса.
Эффект ручных настроек фокуса при включенной
этой функции не определен, драйверы должны игнорировать такие запросы.
Следующий скрипт просто получает два вышеуказанных значения, но вы можете использовать/найти больше настроек на https://pypi.python.org/pypi/v4l2.
#!/usr/bin/env python3
import ctypes
import fcntl
_IOC_NRBITS = 8
_IOC_TYPEBITS = 8
_IOC_SIZEBITS = 14
_IOC_NRSHIFT = 0
_IOC_TYPESHIFT = _IOC_NRSHIFT + _IOC_NRBITS
_IOC_SIZESHIFT = _IOC_TYPESHIFT + _IOC_TYPEBITS
_IOC_DIRSHIFT = _IOC_SIZESHIFT + _IOC_SIZEBITS
_IOC_WRITE = 1
_IOC_READ = 2
V4L2_CTRL_CLASS_CAMERA = 0x009a0000
V4L2_CID_CAMERA_CLASS_BASE = V4L2_CTRL_CLASS_CAMERA | 0x900
V4L2_CID_EXPOSURE_AUTO = V4L2_CID_CAMERA_CLASS_BASE + 1
V4L2_CID_FOCUS_AUTO = V4L2_CID_CAMERA_CLASS_BASE + 12
def _IOC(dir_, type_, nr, size):
return (
ctypes.c_int32(dir_ << _IOC_DIRSHIFT).value |
ctypes.c_int32(ord(type_) << _IOC_TYPESHIFT).value |
ctypes.c_int32(nr << _IOC_NRSHIFT).value |
ctypes.c_int32(size << _IOC_SIZESHIFT).value)
def _IOC_TYPECHECK(t):
return ctypes.sizeof(t)
def _IOWR(type_, nr, size):
return _IOC(_IOC_READ | _IOC_WRITE, type_, nr, _IOC_TYPECHECK(size))
class v4l2_control(ctypes.Structure):
_fields_ = [
('id', ctypes.c_uint32),
('value', ctypes.c_uint32),
]
VIDIOC_G_CTRL = _IOWR('V', 27, v4l2_control)
exposure = v4l2_control(V4L2_CID_EXPOSURE_AUTO)
focus_auto = v4l2_control(V4L2_CID_FOCUS_AUTO)
with open('/dev/video1', 'r') as vd:
fcntl.ioctl(vd, VIDIOC_G_CTRL, exposure)
fcntl.ioctl(vd, VIDIOC_G_CTRL, focus_auto)
print("автоэкспозиция: %i" % exposure.value)
print("автофокус : %i" % focus_auto.value)
Ответ или решение
Чтобы получить информацию о аппаратном обеспечении встроенной веб-камеры вашего ноутбука в системе Ubuntu, вы можете использовать несколько подходов. Однако, стоит отметить, что получить такие специфические параметры, как поле зрения и фокусное расстояние камеры, может быть затруднительно, так как они не всегда хранятся в системных файлах.
Способы получения информации о веб-камере:
-
Использование команды
lsusb
:
Эта команда позволяет просмотреть информацию о всех подключенных USB-устройствах, включая веб-камеру.lsusb -v | grep -i camera
Пример вывода может выглядеть так:
Bus 004 Device 006: ID 04f2:b134 Chicony Electronics Co., Ltd Integrated Camera
Опция
-v
выводит детальную информацию о каждом устройстве. -
Использование Video4Linux (V4L2):
Вы можете использовать API V4L2 для получения дополнительных данных о камере. Например, через Python-скрипт, который позволяет извлекать значения управления камерой.Пример скрипта для получения информации об автоматической экспозиции и автофокусировке:
#!/usr/bin/env python3 import ctypes import fcntl _IOC_NRBITS = 8 _IOC_TYPEBITS = 8 _IOC_SIZEBITS = 14 _IOC_NRSHIFT = 0 _IOC_TYPESHIFT = _IOC_NRSHIFT + _IOC_NRBITS _IOC_SIZESHIFT = _IOC_TYPESHIFT + _IOC_TYPEBITS _IOC_DIRSHIFT = _IOC_SIZESHIFT + _IOC_SIZEBITS _IOC_WRITE = 1 _IOC_READ = 2 V4L2_CTRL_CLASS_CAMERA = 0x009a0000 V4L2_CID_CAMERA_CLASS_BASE = V4L2_CTRL_CLASS_CAMERA | 0x900 V4L2_CID_EXPOSURE_AUTO = V4L2_CID_CAMERA_CLASS_BASE + 1 V4L2_CID_FOCUS_AUTO = V4L2_CID_CAMERA_CLASS_BASE + 12 def _IOC(dir_, type_, nr, size): return ( ctypes.c_int32(dir_ << _IOC_DIRSHIFT).value | ctypes.c_int32(ord(type_) << _IOC_TYPESHIFT).value | ctypes.c_int32(nr << _IOC_NRSHIFT).value | ctypes.c_int32(size << _IOC_SIZESHIFT).value) def _IOC_TYPECHECK(t): return ctypes.sizeof(t) def _IOWR(type_, nr, size): return _IOC(_IOC_READ | _IOC_WRITE, type_, nr, _IOC_TYPECHECK(size)) class v4l2_control(ctypes.Structure): _fields_ = [ ('id', ctypes.c_uint32), ('value', ctypes.c_uint32), ] VIDIOC_G_CTRL = _IOWR('V', 27, v4l2_control) exposure = v4l2_control(V4L2_CID_EXPOSURE_AUTO) focus_auto = v4l2_control(V4L2_CID_FOCUS_AUTO) with open('/dev/video0', 'r') as vd: fcntl.ioctl(vd, VIDIOC_G_CTRL, exposure) fcntl.ioctl(vd, VIDIOC_G_CTRL, focus_auto) print("Автоэкспозиция: %i" % exposure.value) print("Автофокус: %i" % focus_auto.value)
-
Проверка поддержки V4L2:
Вы можете также использовать следующие команды для проверки доступных контроллеров вашей камеры:v4l2-ctl --list-ctrls
Эти команды могут предоставить дополнительную информацию, связанную с настройками камеры, которые поддерживаются драйвером. Однако, как уже упоминалось, информация о поле зрения и фокусном расстоянии часто не доступна через стандартные утилиты и может требовать специфического доступа к данным производителя камеры или дополнительной документации.
Заключение
В режиме командной строки Ubuntu существует несколько методов для получения аппаратной информации о веб-камере, но конкретные аппаратные параметры, такие как поле зрения и фокусное расстояние, могут быть ограничены доступными данными. Рассмотрите возможность использования Python и библиотеки V4L2 для извлечения информации, доступной через API, учитывая, что нужная вам информация может быть недоступна.