Работа с usb видеокамерой в Linux. Часть 1
По популярности видеокамера, сегодня, стоит в одном ряду с микрофоном и наушниками. Она используется в различных направлениях, таких как распознавание объектов, дополненная реальность, видеоконференции и множество других. Но что же скрыто под капотом этих сложнейших программ? Как мы получаем картинку с видеокамеры? Этот цикл статей позволит взглянуть на простоту работы с видеокамерой на низком уровне, обработку полученного изображения.
Для начала, немного информации о работе с устройствами в системе Linux. Устройства в nix системах представляют собой файл. С некоторыми файлами-устройств мы можем работать как с обычными файлами. Например:
эта команда выведет на экран весь диск sda.
Есть устройства с которыми нельзя работать напрямую, к ним относится видеокамера.При попытке это сделать мы получим такую реакцию системы:
~$ cat: /dev/video0: Недопустимый аргумент
*Где /dev/video0 это файл-устройство найшей видеокамеры.
Для работы с ней нам понадобится системная функция ioctl детальнее о ней можно ознакомится [1]. Попробуем это применить. Вот код позволяющий считать информации с устройства (альтернатива команде cat для видеоустройств):
#include #include #include #include #include #include int main (int argc,char* argv[]) < /*Read Params*/ char *device_name; if(argc >1) <   device_name = argv[1]; >else <   device_name = "/dev/video0"; >/*Open Device*/ int file_device = open(device_name, O_RDWR, 0); if (file_device == -1) <   printf ("%s error %d, %s\n",device_name, errno, strerror(errno));   exit(EXIT_FAILURE); >/*Read Params From Device*/ struct v4l2_capability device_params; if (ioctl(file_device, VIDIOC_QUERYCAP, &device_params) == -1) <   printf ("\"VIDIOC_QUERYCAP\" error %d, %s\n", errno, strerror(errno));   exit(EXIT_FAILURE); >printf("driver : %s\n",device_params.driver); printf("card : %s\n",device_params.card); printf("bus_info : %s\n",device_params.bus_info); printf("version : %d.%d.%d\n",      ((device_params.version >> 16) & 0xFF),      ((device_params.version >> 8) & 0xFF),      (device_params.version & 0xFF)); printf("capabilities: 0x%08x\n", device_params.capabilities); printf("device capabilities: 0x%08x\n", device_params.device_caps); /* Close Device */ if (-1 == close (file_device)) <   printf ("\"close\" error %d, %s\n", errno, strerror(errno));   exit(EXIT_FAILURE); >file_device = -1; return 0; >
В первых строках кода считываются параметры с которой запущено приложение. Если параметров нету то device_name принимает стандартоне значение «/dev/video0».
В блоке «Open Device» происходит открытие устройства системной функцией open (нужно подключить header fcntl.h). Обязательный параметр O_RDWR отвечает за открытие устройства считывания/записи. Если при подключении возникла ошибка, то функция open вернет -1.
Блок «Read Params From Device» — это сердце нашей маленькой программы. Для его использования надо подключить билиотеку
возможно прийдется её установить, у каждого дистрибутива свой пакет под эту библиотеку
Системная функция ioctl имеет три параметра:
file_device — дескриптор нашего устройства
VIDIOC_QUERYCAP — функция ядра, которую применяем для нашего устройства.
device_params — область памяти куда будет сброшен результат функции «VIDIOC_QUERYCAP».
device_params это структура состоящая из таких полей:
если возникла ошибка ioctl вернет -1
Блок «Close Device» закрывает дескриптор устройства.
Посмотрим программу в действии.
./catvd /dev/video0 /dev/video0 error 2, No such file or directory
устройство не определилось ядром либо не подключено уборщица опять ненужные провода дергала.
Подключаем и заново запуск. Получаем такую информацию:
./catvd /dev/video0 driver : uvcvideo card : UVC Camera (046d:0804) bus_info : usb-0000:00:12.2-3 version : 3.11.10 capabilities: 0x84000001 device capabilities: 0x04000001
поле capabilities и device capabilities можно расшифровать благодаря константам из файла videodev2.h:
V4L2_CAP_DEVICE_CAPS 0x80000000 // устроство содержит поля для изменения параметров. V4L2_CAP_STREAMING 0x04000000 // это потоковое устройство i/o ioctls. V4L2_CAP_VIDEO_CAPTURE 0x00000001 // устроство имеет функцию видеозахвата.
На этом вводная статья заканчивается. В следующих обзорах будут затронуты, такие темы как memory-mapping, виодеформаты изображения, настройка камеры, вывод изображения в текстуру, работа с несколькими камерами.
Ресурсы используемые в статье:
Настройка Веб-камеры в Линукс
Программы
За последние несколько лет стоимость функциональности операционной системы Linux не сократилась, а даже выросла. Хорошая аппаратная поддержка — одна из последних вещей, которых Linux не хватает по сравнению с другими операционными системами. На самом деле это не ошибка сообщества Linux. Производители оборудования виноваты в том, что они не поддерживают свое собственное оборудование в операционных системах, отличных от проприетарных.
Разработчики сообщества Linux на самом деле делают чудеса с поддержкой аппаратного обеспечения, и я благодарю их за проделанную большую работу. Поддержка веб-камеры была когда-то скрытой в списке оборудования, поддерживаемого Linux. Но сегодня у нас есть видеозахват Video4Linux, поддерживаемый драйверами веб-камеры UVC и GSPCA, и большинство веб-камер успешно работают на наших Linux-ПК.
Это может быть очень запутанным для тех, кто только что установил Ubuntu, чтобы обнаружить, что его веб-камера работает, но что он не контролирует такие параметры, как яркость, контрастность, автоэкспозиция и т. д. Типичный пользователь собственной операционной системы использовал бы элементы управления, для настройки этих настроек. Но мы не отстаем от продвинутых разработчиков, потому что сообщество Linux предоставляет средства для управления нашими веб-камерами.
Позвольте мне представить приложения, которые я использую на своем компьютере Ubuntu с помощью Logitech E3500, Logitech E2500 и многих других веб-камер без названия, чтобы настроить их видео и другие настройки.
Настройка Веб-камеры в Linux
Как вы поняли, в этой статье мы поговорим про настройку веб-камеры в дистрибутивах Linux. Настройка Веб-камеры в Linux является очень простой и сейчас мы расскажем вам как это сделать, самым простым способом. Если у вас возникнут какие-то вопросы — пишите их в форме для комментариев. Мы обязательно подскажем вам, что и как нужно сделать еще более детально.
Сначала есть инструмент Gtk-v4l. Это в основном панель управления для веб-камеры и имеет все настройки, которые драйверы веб-камеры для других операционных систем обеспечивают для вашего веб-камеры Video4Linux.
Работа с веб-камерой в Linux
Также стоит отметить, что драйвера этих программ поддерживают таких производителей как:
- Samsung
- Genius
- Sony
- Tevion
- Trust
- MediaForte
- Micro Innovations
- Hercules
- Jenoptik
- Typhoon
- а также огромное количество других производителей.
Gtk-v4l не находится в репозиториях Ubuntu 17.10, поэтому вы должны добавить свой репозиторий в список источников. Вот команды для этого:
sudo add-apt-repository ppa:libv4l/ppa sudo apt-get update sudo apt-get install gtk-v4l
Второе приложение, которое я использую, называется Guvcview, и это что-то вроде Gtk-v4l plus Cheese. Вы можете управлять своими веб-камерами, записывать снимки, видео и многое другое. Guvcview, как Gtk-v4l, не находится в репозитории Ubuntu 17.10, поэтому вы должны сначала добавить его репозиторий для его установки:
sudo add-apt-repository ppa:pj-assis/ppa sudo apt-get update sudo apt-get install guvcview
На скриншоте выше вы можете увидеть пользовательский интерфейс Guvcview.
Я думаю, что эти два приложения — это средний пользователь, который должен контролировать свои веб-камеры в операционной системе Ubuntu Linux, вы согласны? если вы не являетесь средним пользователем и хотите управлять веб-камерой с помощью CLI с терминала, вы можете найти больше информации на нашем сайте.
Выводы
Настройка Веб-камеры в Linux является очень простой в любой современной версии Ubuntu. Мы рассказали вам про самые лучшие программы, которые являются очень удобными даже для новичка.
Если статья была для вас интересной, то поделитесь ссылкой на нее в своих социальных сетях. Это очень поможет в развитии нашего сообщества.