Usb камера для linux

Web-камеры в Linux

Оригинал: Webcams in Linux
Автор: Carla Schroder
Дата: 21 февраля 2008
Перевод: Андрей Синицын aka boombick
Дата перевода: 25 февраля 2009

При копировании материала обязательны указание автора, переводчика и ссылки на оригинал статьи и настоящую страницу как первоисточник перевода!

Linux и web-камеры

Сегодня web-камеры используются очень широко: большинство ноутбуков уже имеет встроенную web-камеру, многие LCD-мониторы оснащаются ими. Да и приобрести web-камеры, работающую через USB-интерфейс сегодня можно менее, чем 40$. В этой статье я расскажу вам, как настроить web-камеру для работы в linux и полноценно использовать все ее возможности

Вы не добьетесь высокого качества изображения от недорогих web-камер, в любом случае картинка будет не очень четкой и «прерывистой». Но это вполне приемлемая «прерывистость». Камеры low-end класса обычно поддерживают режим 15 кадров в секунду при разрешении 320×240 пикселей. Для сравнения, в фильмах обычно используются 24 кадра в секунду. В более дорогих моделях качество изображения лучше и битрейт повыше. Например, Logitech QuickCam Pro 9000. За цену около 100$ вы получаете встроенный микрофон, автофокус, довольно неплохую оптику и видео с разрещением до 960×720 пикселей

Так что для хорошего изображения на камере лучше не экономить. Также у вас должен быть относительно современный PC, оптимально двухядерный. Обработка видео — ресурсоемкая операция и требует «лошадиных сил». Стандартная минимальная ширина канала для передачи видео — 256 кбит/с в обе стороны

Поддержка web-камер в Linux довольно неплоха, за что стоит сказать спасибо разработчикам Linux. Обычно, производителей камер не очень заботят пользователи операционных систем, отличных от MS Windows. Michel Xhaard (Мишель Ксард) , например, с незначительной сторонней помощью разработал драйвер, который подходит более чем к 250 моделям web-камер. Этот базовый драйвер, GSPCA/SPCA5xx, входит в Debian и производные от него дистрибутивы. Также хорошие люди поддерживают проект драйвера и ПО Linux UVC , с помощью которого можно заставить заработать еще некоторые модели камер. Еще можно поблагодарить разработчиков проекта Драйвера для USB-камер Philips , хотя они по большей части поддерживают более старые модели

Плохой момент в словосочетании «неплохая поддержка» заключается в том, что в большинстве случаев драйвера придется компилировать и устанавливать руками. Добро пожаловать в старые добрые времена!

Заставляем камеру работать

Если вы еще не приобрели камеру, то сперва имеет смысл выяснить, какие модели наиболее хорошо поддерживаются в вашем дистрибутиве. Mandriva Linux наиболее «дружественна» к web-камерам. Камеры от Logitech — самые популярные, но не все модели имеют «нативные» драйвера для Linux

Если у вас уже есть web-камера, то можете уповать на везение — возможно камера заработает, как только вы подключите ее. Вот самый короткий и простой путь:

Если Camorama не работает, то можно попробовать использовать аккаунт Testbed в kopete. На рисунке изображен мой разговор с лучшим другом через kopete.

Также на скриншоте видна проблема с настройкой интегрированной камеры — вы должны поворачивать весь монитор для получения корректного изображения. К слову, я сидела довольно высоко 🙂

Camorama не поддерживает v4l2, а жаль — во второй версии сделано довольно много улучшений и исправлено много ошибок по сравнению с первой версией. На Ubuntuforums пользователи часто спрашивают, почему у них появляется ошибка «could not connect to video device (dev/video0)» при использовании Camorama. Это означает, что используется драйвер, которому нужен v4l2, или v4l вообще не установлен.

Читайте также:  Windows phone on ps3

В современных Linux-дистрибутивах udev и HAL должны самостоятельно определить камеру, создать устройство /dev/video0, владельцем которого является root и принадлежащее группе video, и загрузить нужный модуль ядра. Если вы не входите в группу video, то добавьте себя туда и перелогиньтесь. Для проверки членства в группе запустите команду id без параметров. Чтобы проверить, загрузился ли нужный модуль, запустите lsmod

Узнаем «секретное имя» web-камеры

Моя камера встроена в LCD-монитор Viewsonic VX2255. Также у этого монитора есть встроенный микрофон. Камера подключается при помощи отдельного USB-кабеля. Я подключила ее и запустила следующие команды, чтобы проверить, «схватила» ли ее моя Ubuntu Gutsy

Это говорит о том, что камера поддерживается модулем ucvvideo и я могу воспользовать web-поиском для получения более подробной информации, потому что я знаю Супер Секретное Имя Web-Камеры. Помните, что вывод dmesg обновляется при подключении и отключении устройств, так что не лишним будет запомнить последние строки. Если же в выводе dmesg нет камеры, значит ядро не видит устройство и вам не повезло

Полезные ресурсы

  • Один человек написал драйвера для 235 USB Web-камер
  • Linux UVS драйвера и ПО
  • Установка web-камеры. HOWTO. Это руководство написано для Gentoo, но подойдет для всех дистрибутивов
  • Web-камеры в Ubuntu
  • Настройка камеры в Debian Etch
  • Linux и Logitech QuickCam Pro 9000

Другие статьи на тему вебкамер на нашем сайте:

  • Jun Auza, перевод: Н.Ромоданов, «Превращаем обычную веб-камеру в камеру слежения, работающую в Ubuntu Linux» Если вы хотите превратить обычную веб-камеру в камеру слежения, чтобы знать, кто крадет ваших кур, то вам следует прочитать данную статью.

Источник

Захват видео с USB камер на устройствах под управлением Linux

Предыстория

  1. Видео в разрешении FullHD (1920Х1080) или HD (1280х720) и нормальная частота кадров (чтобы можно было играть).
  2. Игрушку я планировал отдать детям, поэтому нужен был автостарт и поддержка подключения/отключения камеры.

В общем хотелось что-то вроде этого:

Ограничения

Я не собирался искать решение, которое работает всегда и везде. Следующие ограничения меня вполне устраивали:

  1. Хороший WiFi сигнал.
  2. Ограниченное число подключений, приоритет отдавался случаю, когда есть всего один клиент.
  3. Камера поддерживает режим MJPG.

HW и SW

Предварительный анализ

Код UVC драйвера оказался готов к добавлению различного рода “специальных” решений, и я легко нашел место, где надо скорректировать размер буфера (функция uvc_fixup_video_ctrl()). Более того, драйвер поддерживает набор quirks, которые позволяют поддерживать камеры с разного рода отклонениями от стандарта UVC. В общем, разработчики драйвера сделали лучшее, что возможно для поддержки зоопарка камер.

Добавив коррекцию размера буфера, я получил стабильную работу в режиме 1280х720 и даже в режиме 1920х1080. Ура! Половина задачи решена!

В поисках новых приключений

Немного порадовавшись первой удаче, я вспомнил, что mjpg-streamer далек от совершенства. Наверняка можно сделать что-то простое, не такое универсальное как mjpg-streamer, но более подходящее для моих условий. Так я решил сделать uvc2http.

В mjpg-streamer мне не понравилось использование нескольких потоков и копирование буферов. Это определило архитектуру решения: 1 поток и никакого копирования. Используя non-blocking IO, это делается достаточно просто: захватываем кадр и без копирования отсылаем его клиенту. Есть небольшая проблема: пока мы отсылаем данные из буфера, мы не можем вернуть буфер обратно в очередь. А пока буфер не в очереди, драйвер не может положить в него новый кадр. Но если размер очереди > 1, то это становится возможным. Число буферов определяет максимальное количество подключений, которое можно гарантированно обслуживать. Т.е., если я хочу гарантированно поддерживать 1 клиента, то 3-х буферов достаточно (в один буфер пишет драйвер, из второго отсылаем данные, третий в запасе, чтобы избежать конкуренции с драйвером за буфер при попытке получить новый кадр).

Читайте также:  Дистрибутив для windows x64 что это

Uvc2http

Uvc2http состоит из двух компонентов: UvcGrabber и HttpStreamer. Первый отвечает за получение буферов (кадров) из очереди и возврат их обратно в очередь. Второй отвечает за обслуживание клиентов по HTTP. Есть еще немного кода, который связывает эти компоненты. Подробности можно посмотреть в исходниках.

Неожиданная проблема

Все было замечательно: приложение работало и в разрешении 1280х720 выдавало 20+ кадров/сек. Я делал косметические изменения в коде. После очередной порции изменений я замерил частоту кадров. Результат был удручающий — меньше 15 кадров. Я бросился искать, что же привело к деградации. Я потратил, наверное, 2 часа в течение которых частота уменьшалась с каждым замером до значения 7 кадров/сек. В голову лезли разные мысли о деградации из-за долгой работы роутера, из-за его перегрева. Это было что-то непонятное. В какой-то момент я отключил стримминг и увидел, что просто один захват (без стримминга) давал те же 7 кадров. Я даже начал подозревать проблемы с камерой. В общем какая-то чушь. Дело было вечером и камера, повернутая в окно, показывала что-то серое. Дабы сменить мрачное изображение я повернул камеру внутрь комнаты. И, о чудо! Частота кадров увеличилась до 15 и я все понял. Камера автоматически подстраивала время экспозиции и в какой-то момент это время стало больше длительности кадра при заданной частоте. За эти два часа случилось следующее: сначала плавно темнело (это был вечер), а потом я повернул камеру внутрь освещенной комнаты. Направив камеру на люстру я получил 20+ кадров/сек. Ура.

Другие проблемы и нюансы использования

Результаты

Ниже табличка с результатами сравнения mjpg-streamer и uvc2http. Если коротко — есть значительный выигрыш в потреблении памяти и небольшой выигрыш в частоте кадров и загрузке CPU.

1280×720 1920×1080
VSZ, KB, 1 client VSZ, KB, 2 clients CPU, %, 1 client CPU, %, 2 clients FPS, f/s, 1 client FPS, f/s, 2 clients VSZ, KB, 1 client VSZ, KB, 2 clients CPU, %, 1 client CPU, %, 2 clients FPS, f/s, 1 client FPS, f/s, 2 clients
Mjpg-streamer 16860 19040 26 43 17.6 15 25456 25812 28 50 13.8 10
uvc2http 3960 3960 26 43 22 19.6 7576 7576 28 43 15.5 12.2

Ну и конечно же видео, которое я сделал вместе с детьми:

Фото получившегося танка (получилось что-то вроде цыганской телеги):

Использование

Исходники находятся здесь. Для использования на PC Linux надо всего лишь собрать (при условии что вы не хотите патчить драйвер UVC). Утилита собирается с помощью CMake стандартным способом. Если же надо использовать в OpenWRT, то надо сделать дополнительные шаги:

  1. Скопировать содержимое директории OpenWrt-15.05 в корень репозитория OpenWRT. Эти файлы только для OpenWRT 15.05. Они описывают новый пакет для OpenWRT и патч для драйвера UVC.
  2. Если ваша камера также возвращает завышенный размер необходимого буфера, то надо добавить использование quirk UVC_QUIRK_COMPRESSION_RATE для вашей камеры в файле uvc_driver.c. Для этого надо сделать собственный патч для драйвера UVC. Как это сделать, описано здесь wiki.openwrt.org/doc/devel/patches. Вам необходимо добавить описание вашей камеры в массив uvc_ids. В качестве примера можно посмотреть на описание моей камеры:
  • Настроить сборку OpenWRT стандартный методом (http://wiki.openwrt.org/doc/howto/build). При настройке необходимо выбрать пакет uvc2http в меню Multimedia.
  • Собрать пакет uvc2http или полный образ (обязательно если вам необходим патч драйвера) для вашей целевой платформы. Если установить утилиту как пакет, то она будет запускаться при старте.
  • Установить пакет на устройство/обновить систему
  • Читайте также:  Почему дисковод не читает диски с windows

    Что дальше

    Решение состоит из двух частей: патч драйвера и другой алгоритм стримминга. Патч драйвера можно было бы включить в новую версию ядра линукса, но это спорное решение, так как оно основано на предположении о минимальном коэффициенте сжатия. Утилита же, на мой взгляд, хорошо подходит для использования на слабых системах (игрушках, домашних системах видеонаблюдения), и ее можно немного улучшить, добавив возможность задавать настройки камеры через параметры.

    Алгоритм стримминга можно улучшить так как есть запас по загрузке CPU и по ширине канала (я легко получал с роутера 50+ MBit подключая десяток клиентов). Также можно добавить поддержку звука.

    Источник

    Работа с usb видеокамерой в Linux. Часть 2

    Продолжаем цикл статей про программирование видеокамеры в Linux. В первой части [1], мы рассмотрели механизм открытия и считывания первичных параметров видеоустройства. Была написана простенькая утилита catvd. Сегодня расширим функционал нашей маленькой программы , но сначала надо написать обертку для функции ioctl.

    Эта обертка позволяет прервать программу если была ошибка и показать сообщение.

    &nbsp&nbspПопробуем считать картинку с камеры и сохранить в файл.

    метод readFrame — отвечает за чтение и обработку полученого изображения.
    методы initMMAP(), freeMMAP() — создание/очистка буфера памяти устройства.
    методы startCapturing(), stopCapturing() — включение/выключение режима streaming у видеоустройства. Наличие этих функций, у камеры, можно проверить флагом V4L2_CAP_STREAMING [*].

    &nbsp&nbspРазберем метод initMMAP

    функция VIDIOC_REQBUFS [↓] позволяет проинициализировать буфер памяти внутри устройства. Структура v4l2_requestbuffers задает параметры инициализации

    &nbsp&nbspПосле того, как буфер был проинициализирован, его надо отобразить на область памяти (mapping).
    Функция VIDIOC_QUERYBUF [↓] позволяет считать параметры буфера, которые будут использоваться для создания memory-mapping области. Структура v4l2_buffer большая, опишу необходимые поля:

    системная функция mmap() [3] позволяет отображать файл или область памяти устройств в оперативную память. Для использования mmap() необходимо подключить

    &nbsp&nbspДалее необходимо переключить камеру в режим захвата.

    Функция VIDIOC_QBUF [↓] ставит буфер в очередь обработки драйвером устройства. Поля используются такие же, как и для VIDIOC_REQBUFS или VIDIOC_QUERYBUF.
    Функция VIDIOC_STREAMON[↓] включает камеру в режим захвата.

    &nbsp&nbspТеперь камера включена и захватывает изображения. Но картинку еще надо получить.

    Функция VIDIOC_DQBUF[↓] освобождает буфер из очереди обработки драйвера. В результате можем получить ошибку EAGAIN. Ничего опасного в этом нет, надо еще раз вызвать VIDIOC_DQBUF. Это происходит потому, что драйвер еще обрабатывает запрос и не может освободить буфер из очереди. При успешном выполнении этой функции, мы получаем в «руки» нашу картинку. В самом начале статьи, в коде был добавлен итератор. Итератор позволяет проследить сколько итераций вхолостую проходит цикл до успешного выполнения VIDIOC_DQBUF.

    Вывод программы следующий

    Из «iter == 831013» видно — картинка скидывается в буфер довольно долго. Для ускорения можно использовать несколько буферов и вытаскивать картинку с первого свободного и т.д.

    &nbsp&nbspСегодня была рассмотрена инициализация буфера памяти и чтения из него картинки. Изображение сохраняется в raw формате. Можно открыть программой Shotwell. В следующей статье будет рассмотрен вывод изображению в текстуру (через SDL2), затронуты некоторые форматы изображения и настройки камеры.

    Источник

    Оцените статью