Назад | Вперед | Содержание
Приложение
Этот проект поддерживает передачу видеопотоков и изображений через различные интерфейсы и протоколы, включая:
Потоки идентифицируются по URI ресурса и доступны через API videoSource
и videoOutput
. Таблицы ниже показывают поддерживаемые протоколы ввода/вывода и примеры URI для каждого типа потока:
|------------------|--------------|---------------------------|--------------------------------------------------------------|
| Камера MIPI CSI | csi://
| csi://0
| Камера CSI 0 (замените номер камеры на 0
) |
| Камера V4L2 | v4l2://
| v4l2:///dev/video0
| Устройство V4L2 0 (замените номер камеры на 0
) |
| Поток RTP | rtp://
| rtp://@:1234
| localhost, порт 1234 (требуется дополнительная конфигурация) |
| Поток RTSP | rtsp://
| rtsp://<remote-ip>:1234
| Замените <remote-ip>
на IP-адрес или имя хоста удаленного сервера |
| Файл видео | file://
| file://my_video.mp4
| Поддерживает загрузку MP4, MKV, AVI, FLV (см. кодеки ниже) |
| Файл изображения | file://
| file://my_image.jpg
| Поддерживает загрузку JPG, PNG, TGA, BMP, GIF и т.д. |
| Последовательность изображений | file://
| file://my_directory/
| Ищет изображения в алфавитном порядке |* Поддерживаемые декодерные кодеки: H.264, H.265, VP8, VP9, MPEG-2, MPEG-4, MJPEG
file://
, v4l2://
и csi://
могут быть опущены из URI как сокращениеПротокол | URI ресурса | Примечания | |
---|---|---|---|
Поток RTP | rtp:// |
rtp://<remote-ip>:1234 |
Замените <remote-ip> на IP-адрес или имя хоста удаленного сервера |
Видеофайл | file:// |
file://my_video.mp4 |
Поддерживает сохранение в форматах MP4, MKV, AVI, FLV (см. кодеки ниже) |
Изображение | file:// |
file://my_image.jpg |
Поддерживает сохранение в форматах JPG, PNG, TGA, BMP |
Последовательность изображений | file:// |
file://image_%i.jpg |
%i заменяется номером изображения в последовательности |
Окно OpenGL | display:// |
display://0 |
Создает окно GUI на экране 0 |
file://
могут быть опущены из URI как сокращение--headless
imagenet
/imagenet.py
, detectnet
/detectnet.py
, segnet
/segnet.py
, video-viewer
/video-viewer.py
, и т. д.). Эти аргументы командной строки обычно имеют следующий формат:```bash$ imagenet [options] input_URI [output_URI] # URI вывода является необязательным
где URI входных и выходных данных указываются двумя позиционными аргументами. Например:
```bash
$ imagenet input.jpg output.jpg # классифицировать input.jpg, сохранить как output.jpg
Как упоминалось выше, любой из примеров из jetson-inference может быть использован здесь, так как они используют одинаковую обработку командной строки. Ниже приведены дополнительные опции потока, которые можно указать при запуске каждого из программ:
input_URI ресурс URI входного потока (см. таблицу выше)
--input-width=ШИРИНА явное указание разрешения входного потока --input-height=ВЫСОТА (разрешение не обязательно, кроме случаев с RTP) --input-codec=КОДИРОВЩИК для RTP требуется указание кодировщика, один из следующих: * h264, h265 * vp8, vp9 * mpeg2, mpeg4 * mjpeg --input-flip=ПОДКЛОНЯЕМЫЙ метод переворота для входного потока (исключает V4L2): * none (по умолчанию) * против часовой стрелки * поворот на 180 градусов * по часовой стрелке * горизонтальный * вертикальный * диагональный верхний правый * диагональный верхний левый --input-loop=ЦИКЛ для файловых входных данных, количество циклов для выполнения: * -1 = цикл бесконечно * 0 = не цикл (по умолчанию) * >0 = задать количество циклов --input-rtsp-latency=2000 Количество миллисекунд буферизации входного потока RTSP. Установка значения в ноль может дать очень низкую задержку, но может привести к дрожанию в зависимости от производительности сети.
output_URI ресурс URI выходного потока (см. таблицу выше)
--output-codec=КОДИРОВЩИК желаемый кодировщик для сжатого выходного потока: * h264 (по умолчанию), h265 * vp8, vp9 * mpeg2, mpeg4 * mjpeg --bitrate=БИТНАЯ_СКОРОСТЬ желаемая целевая VBR битовая скорость для сжатого потока, в битах в секунду. По умолчанию 4000000 (4 Мбит/с) --headless не создавать стандартное окно графического интерфейса OpenGL
Ниже приведены примеры команд для запуска инструмента `video-viewer` на различных типах потоков. Вы можете заменить другие программы на `video-viewer` в этих командах, так как они используют одинаковые аргументы. В разделе [Исходный код](#source-code) этой страницы вы можете ознакомиться с содержимым исходного кода инструмента `video-viewer`, чтобы узнать, как использовать API `videoSource` и `videoOutput` в своих собственных приложениях.
## Камеры MIPI CSI
Камеры MIPI CSI являются компактными сенсорами, которые подключаются напрямую к интерфейсу CSI/ISP процессора Jetson. Поддерживаемые камеры MIPI CSI включают:
* [Raspberry Pi Camera Module v2](https://www.raspberrypi.org/products/camera-module-v2/) (IMX219) для Jetson Nano и Jetson Xavier NX
* Модуль камеры OV5693 из набора разработчика Jetson TX1/TX2.
* См. страницу [Jetson Partner Supported Cameras](https://developer.nvidia.com/embedded/jetson-partner-supported-cameras) для получения информации о других поддерживаемых сенсорах.Вот несколько примеров запуска с использованием камеры MIPI CSI. Если у вас подключено несколько камер MIPI CSI, замените номер камеры на 0:
```bash
$ video-viewer csi://0 # Камера MIPI CSI 0 (замените номер камеры на другие значения)
$ video-viewer csi://0 output.mp4 # Сохранение выходного потока в файл MP4 (по умолчанию используется H.264)
$ video-viewer csi://0 rtp://<remote-ip>:1234 # Передача выходного потока через RTP на <remote-ip>
По умолчанию камеры MIPI CSI создаются с разрешением 1280x720. Чтобы указать другое разрешение, используйте опции --input-width
и --input-height
. Обратите внимание, что указанное разрешение должно совпадать с одним из поддерживаемых форматов камеры.
$ video-viewer --input-width=1920 --input-height=1080 csi://0
USB-веб-камеры обычно поддерживаются как устройства V4L2, например, Logitech C270 или C920.```bash $ video-viewer v4l2:///dev/video0 # /dev/video0 можно заменить на /dev/video1 и т.д. $ video-viewer /dev/video0 # Удаление префикса протокола v4l2:// допустимо $ video-viewer /dev/video0 output.mp4 # Сохранение выходного потока в файл MP4 (по умолчанию используется H.264) $ video-viewer /dev/video0 rtp://:1234 # Передача выходного потока через RTP на
> **Примечание:** если у вас подключена камера MIPI CSI, она также будет отображаться как `/dev/video0`. Если вы подключите USB-веб-камеру, она будет отображаться как `/dev/video1`, поэтому вы захотите заменить `/dev/video1` в командных строках выше. Использование CSI-камер через V4L2 не поддерживается в этом проекте, так как через V4L2 они используют сырой Bayer без ISP (вместо этого используйте CSI-камеры, как показано [выше](#mipi-csi-камеры)).#### Форматы V4L2
По умолчанию, камеры V4L2 создаются с использованием формата камеры с максимальной частотой кадров, который наиболее точно соответствует желаемому разрешению (по умолчанию, это разрешение составляет 1280x720). Формат с максимальной частотой кадров может быть зашифрован (например, с использованием H.264 или MJPEG), так как USB-камеры обычно передают несжатые YUV/RGB при более низкой частоте кадров. В этом случае кодек будет обнаружен, и поток камеры будет автоматически декодирован с использованием аппаратного декодера Jetson для достижения максимальной частоты кадров.
Если вы явно хотите выбрать формат, используемый V4L2-камерой, вы можете сделать это с помощью опций `--input-width`, `--input-height` и `--input-codec`. Возможные опции декодера кодека включают `--input-codec=h264, h265, vp8, vp9, mpeg2, mpeg4, mjpeg`.
```bash
$ video-viewer --input-width=1920 --input-height=1080 --input-codec=h264 /dev/video0
Когда вы запускаете одно из приложений jetson-inference на V4L2-источнике, различные поддерживаемые форматы V4L2-камеры будут записаны в терминал. Однако вы также можете перечислить эти поддерживаемые форматы с помощью команды v4l2-ctl
:
$ sudo apt-get install v4l-utils
$ v4l2-ctl --device=/dev/video0 --list-formats-ext
--input-codec
), так как RTP не имеет возможности динамически запрашивать его. В этом случае RTP используется как источник ввода с другого устройства:```bash$ video-viewer --input-codec=h264 rtp://@:1234 # получение на локальном хосте порт 1234 $ video-viewer --input-codec=h264 rtp://224.0.0.0:1234 # подписка на группу мультикаста
Команды выше указывают RTP как источник ввода, где другой удаленный хост на сети передает поток на Jetson. Однако вы также можете передать RTP-поток с вашего Jetson на другой удаленный хост на сети.#### Передача RTP
Чтобы передать выходной поток RTP, укажите целевой IP/порт как `output_URI`. Если необходимо, вы можете указать скорость передачи данных (по умолчанию `--bitrate=4000000` или 4 Мбит/с) и/или выходной кодек (по умолчанию `--output-codec=h264`), который может быть `h264, h265, vp8, vp9, mjpeg`
```bash
$ video-viewer --bitrate=1000000 csi://0 rtp://<remote-ip>:1234 # передача камеры через RTP, закодированной как H.264 @ 1 Мбит/с
$ video-viewer --output-codec=h265 my_video.mp4 rtp://<remote-ip>:1234 # передача видео-файла через RTP, закодированного как H.265
При передаче RTP вам нужно явно указать IP-адрес или имя хоста удаленного хоста (или мультикаст-группы), на который отправляется поток (показано выше как <remote-ip>
). См. ниже для некоторых подсказок по просмотру потока RTP с ПК.
Если ваш Jetson передает RTP на другой удаленный хост (например, на ПК), вот несколько примеров команд, которые вы можете использовать для просмотра потока:
* [Установите GStreamer](https://gstreamer.freedesktop.org/documentation/installing/index.html) и запустите этот пайплайн (замените `port=1234` на порт, который вы используете)
```bash
$ gst-launch-1.0 -v udpsrc port=1234 \
caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" ! \
rtph264depay ! decodebin ! videoconvert ! autovideosink
```
* Используя VLC Player:
* Создайте файл SDP (.sdp) с следующим содержимым (замените `1234` на порт, который вы используете)
```
c=IN IP4 127.0.0.1
m=video 1234 RTP/AVP 96
a=rtpmap:96 H264/90000
```
* Откройте поток в VLC, дважды щелкнув файл SDP
* Вы можете захотеть уменьшить настройки `File caching` и `Network caching` в VLC, как [показано здесь](https://www.howtogeek.com/howto/windows/fix-for-vlc-skipping-and-lagging-playing-high-def-video-files/)
* Если ваш удаленный хост — это другой Jetson:
* Используйте ту же команду `video-viewer`, как [выше](#rtp) (замените `1234` на порт, который вы используете)
```bash
$ video-viewer --input-codec=h264 rtp://@:1234
```## RTSP
Сетевые потоки RTSP подписываются удаленным хостом через UDP/IP. В отличие от RTP, RTSP может динамически запрашивать свойства потока (например, разрешение и кодек), поэтому эти опции не требуют явного указания.
```bash
$ video-viewer rtsp://<remote-ip>:1234 my_video.mp4 # подписка на RTSP поток с <remote-ip>, порт 1234 (и сохранение в файл)
$ video-viewer rtsp://username:password@<remote-ip>:1234 # с аутентификацией (замените username/password на соответствующие учетные данные)
Примечание: RTSP поддерживается только в качестве входного потока. Выход RTSP требует дополнительной поддержки в GStreamer для RTSP сервера.
Вы можете воспроизводить и записывать видеофайлы в форматах MP4, MKV, AVI и FLV.
# воспроизведение
$ video-viewer my_video.mp4 # отображение видеофайла
$ video-viewer my_video.mp4 rtp://<remote-ip>:1234 # передача видео по RTP
# запись
$ video-viewer csi://0 my_video.mp4 # запись видео с CSI камеры в файл
$ video-viewer /dev/video0 my_video.mp4 # запись видео с V4L2 камеры в файл
При загрузке видеофайлов кодек и разрешение автоматически определяются, поэтому их не нужно устанавливать. При сохранении видеофайлов по умолчанию используется кодек H.264, но его можно изменить с помощью опции --output-codec
.
$ video-viewer --output-codec=h265 input.mp4 output.mp4 # транскодирование видео в H.265
Поддерживаются следующие кодеки:* Декодирование - H.264, H.265, VP8, VP9, MPEG-2, MPEG-4, MJPEG
При загрузке видеофайлов разрешение автоматически определяется. Однако, если вы хотите, чтобы входное видео было изменено на другое разрешение, вы можете указать опции --input-width
и --input-height
:
$ video-viewer --input-width=640 --input-height=480 my_video.mp4 # изменение размера видео на 640x480
По умолчанию видео завершается, когда достигается конец потока (EOS). Однако, указав опцию --loop
, вы можете установить количество циклов, которое вы хотите, чтобы видео воспроизводилось. Возможные значения для --loop
:
-1
= циклическое воспроизведение до бесконечности0
= не циклическое воспроизведение (по умолчанию)>0
= установка количества циклов$ video-viewer --loop=10 my_video.mp4 # циклическое воспроизведение видео 10 раз
$ video-viewer --loop=-1 my_video.mp4 # циклическое воспроизведение видео до бесконечности (пока пользователь не завершит)
Вы можете загружать/сохранять изображения в следующих форматах:
$ video-viewer input.jpg output.jpg # загрузить/сохранить изображение
Вы также можете создавать циклы изображений и последовательности изображений — см. раздел Циклы входных данных выше.#### Последовательности
Если путь является директорией или содержит маски, все изображения будут загружены/сохранены последовательно (в алфавитно-цифровом порядке).
$ video-viewer input_dir/ output_dir/ # загрузить все изображения из input_dir и сохранить их в output_dir
$ video-viewer "*.jpg" output_%i.jpg # загрузить все jpg изображения и сохранить их как output_0.jpg, output_1.jpg и т.д.
примечание: при использовании масок всегда заключайте её в кавычки (
"*.jpg"
). В противном случае, ОС автоматически расширит последовательность и изменит порядок аргументов на командной строке, что может привести к перезаписи одного из входных изображений выходным.
При сохранении последовательности изображений, если путь указывает только на директорию (output_dir
), то изображения будут автоматически сохранены в формате JPG с форматом output_dir/%i.jpg
, используя номер изображения в качестве имени файла (output_dir/0.jpg
, output_dir/1.jpg
и т.д.).
Если вы хотите указать формат имени файла, сделайте это с помощью стиля printf %i
в пути (output_dir/image_%i.png
). Вы можете применить дополнительные модификаторы printf, такие как %04i
, чтобы создать имена файлов вида output_dir/image_0001.jpg
.
videoSource
и videoOutput
. Эти объекты имеют возможность обрабатывать каждый из типов потоков выше через унифицированный набор API. Изображения могут быть захвачены и выведены в следующих форматах данных:| Строка формата | imageFormat
enum | Тип данных | Глубина битов ||---------------|------------------|-----------|-----------|
| rgb8
| IMAGE_RGB8
| uchar3
| 24 |
| rgba8
| IMAGE_RGBA8
| uchar4
| 32 |
| rgb32f
| IMAGE_RGB32F
| float3
| 96 |
| rgba32f
| IMAGE_RGBA32F
| float4
| 128 |* тип данных и перечисление imageFormat
являются типами C++
videoSource.Capture()
для запроса определенного формата (по умолчанию используется rgb8
)videoSource::Capture()
определяет формат на основе типа данных указателя на выходДля конвертации изображений в различные форматы смотрите страницу Изменение изображений с использованием CUDA для дополнительной информации.
Ниже приведен исходный код для video-viewer.py
и video-viewer.cpp
, немного сокращенный для улучшения читаемости:
import jetson.utils
import argparse
import sys
# Парсинг командной строки
parser = argparse.ArgumentParser()
parser.add_argument("input_URI", type=str, help="URI входного потока")
parser.add_argument("output_URI", type=str, default="", nargs='?', help="URI выходного потока")
opt = parser.parse_known_args()[0]
# Создание источников и выходов видео
input = jetson.utils.videoSource(opt.input_URI, argv=sys.argv)
output = jetson.utils.videoOutput(opt.output_URI, argv=sys.argv)
```# Захват кадров до тех пор, пока пользователь не выйдет
while output.IsStreaming():
image = input.Capture(format='rgb8') # также может быть format='rgba8', 'rgb32f', 'rgba32f'
output.Render(image)
output.SetStatus("Видеопросмотр | {:d}x{:d} | {:.1f} FPS".format(image.width, image.height, output.GetFrameRate()))
```### C++
```c++
#include "videoSource.h"
#include "videoOutput.h"
int main( int argc, char** argv )
{
// создание входного/выходного потока
videoSource* inputStream = videoSource::Create(argc, argv, ARG_POSITION(0));
videoOutput* outputStream = videoOutput::Create(argc, argv, ARG_POSITION(1));
if( !inputStream )
return 0;
// цикл захвата/отображения
while( true )
{
uchar3* nextFrame = NULL; // также может быть uchar3, uchar4, float3, float4
if( !inputStream->Capture(&nextFrame, 1000) )
continue;
if( outputStream != NULL )
{
outputStream->Render(nextFrame, inputStream->GetWidth(), inputStream->GetHeight());
// обновление строки состояния
char str[256];
sprintf(str, "Видеопросмотр (%ux%u) | %.1f FPS", inputStream->GetWidth(), inputStream->GetHeight(), outputStream->GetFrameRate());
outputStream->SetStatus(str);
}
// проверка, завершил ли пользователь
if( !outputStream->IsStreaming() )
break;
if( !inputStream->IsStreaming() )
break;
}
// освобождение ресурсов
SAFE_DELETE(inputStream);
SAFE_DELETE(outputStream);
}
Далее | Манипуляции с изображениями с помощью CUDA
© 2016-2020 NVIDIA | Содержание
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )