2

Я ищу инструмент командной строки, который может сделать снимок с веб-камеры как можно быстрее и записать его на стандартный вывод. Кроме того, я хотел бы иметь возможность указать параметры, такие как формат ввода, разрешение и формат вывода.

Моя первая попытка была ffmpeg:

ffmpeg -f video4linux2 -video_size 1920x1080 -input_format yuyv422 -i /dev/video0 -f image2 -frames:v 1 -qscale:v 2 pipe:1

Однако это имеет два недостатка:

  1. Для записи изображения в стандартный вывод требуется около 3 секунд, что, по-видимому, связано со временем, которое требуется для инициализации веб-камеры.

  2. Снимок, сделанный таким образом, довольно темный, вероятно, веб-камера должна захватывать видеокадры для регулировки яркости и т.д.

Моя следующая идея - непрерывно захватывать видеокадры с веб-камеры (т. Е. «Держать веб-камеру активной»), передавать эти видеокадры куда-нибудь, а затем захватывать отдельные видеокадры и преобразовывать их в изображения по запросу. Тем не менее, я не знаю, как это сделать (и если есть лучший способ).

РЕДАКТИРОВАТЬ: мне нужна одноразовая команда, которая записывает изображение в стандартный вывод, поэтому я могу использовать его на сервере http для обслуживания запроса HTTP GET. Это должно быть быстро, потому что фотографирование блокирует механический процесс в машине.

2 ответа2

3

Для моей веб-камеры fswebcam делает снимок менее чем за полсекунды:

$ time fswebcam test1.jpg
...
real    0m0.491s
user    0m0.024s
sys     0m0.000s

Это займет немного больше времени, чтобы записать в stdout и затем сохранить его:

$ time fswebcam - > test2.jpg
...
real    0m0.538s
user    0m0.029s
sys     0m0.000s

Вы также можете делать снимки каждые n секунд (--loop n), если это то, что вам нужно (вы не объяснили, почему вы хотите его как можно быстрее, и если или как цикл может помочь).

Вы можете сделать изображение ярче, отрегулировать контрастность и т.д. С помощью элементов управления, отображаемых с помощью fswebcam --list-controls .

1

Я сам нашел одно возможное решение, хотя оно не является оптимальным, потому что на Raspberry Pi, где я хочу реализовать это, оно уменьшает FPS до половины значения, поддерживаемого камерой (и ниже FPS = больше возможной задержки до следующего кадра видео, которое извлекать как изображение).

Я использую ffmpeg для копирования видеоданных с аппаратного устройства в /dev /video0 на устройство с обратной связью v4l2 в /dev /video1. Таким образом, камера остается активной, потому что ffmpeg читает с нее в /dev /video0, в то время как я могу использовать другой экземпляр ffmpeg для извлечения изображений из /dev /video1.

Чтобы установить петлю v4l2 в Raspbian GNU/Linux 9 (растянуть):

  1. Установите заголовки ядра: apt-get install raspberrypi-kernel-headers (Re: Как установить kernel-headers)
  2. Установить v4l2-loopback: apt-get install v4l2loopback-dkms (дистрибутив v4l2-loopback)
  3. Добавить устройство обратной связи: modprobe v4l2loopback или с большим количеством устройств modprobe v4l2loopback devices=2 (запуск v4l2-loopback)

Чтобы скопировать видео из /dev /video0 в /dev /video1:

 ffmpeg -f video4linux2 -video_size 1920x1080 -input_format yuyv422 -i /dev/video0 -codec copy -f video4linux2 /dev/video1

Моя камера поддерживает форматы mjpeg и yuyv422, но на петлевое устройство можно скопировать только "сырой" формат, поэтому я должен использовать yuyv422. Камера поддерживает до 6 кадров в секунду при использовании yuyv422 и 1920x1080, но Raspberry Pi 2 Model B удается скопировать только 3 кадра в секунду на шлейфовое устройство.

Теперь я могу использовать команду, которую я уже упоминал в этом вопросе, для извлечения изображений в формате JPEG:

ffmpeg -f video4linux2 -video_size 1920x1080 -input_format yuyv422 -i /dev/video1 -f image2 -frames:v 1 -qscale:v 2 pipe:1

Или как растровое изображение:

 ffmpeg -f video4linux2 -video_size 1920x1080 -input_format yuyv422 -i /dev/video1 -c:v bmp -f image2 -pix_fmt bgr24 -frames:v 1 pipe:1

При чтении этих команд с устройства обратной петли изображения не темные, и их отправка на стандартный вывод занимает около 1,3 секунды (JPEG) или 1,1 секунды (растровое изображение).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .