Orin开发套件09-为容器接入USB摄像头

前面教大家使用DeepStream的Docker镜像去创建自己的Python工作环境,其好处是即使Jetson设备需要使用JetPack重新安装系统,我们只要重新启动这个Docker容器就可以,无需重复环境配置的工作。

前面教大家使用DeepStreamDocker镜像去创建自己的Python工作环境,其好处是即使Jetson设备需要使用JetPack重新安装系统,我们只要重新启动这个Docker容器就可以,无需重复环境配置的工作。

输入源在视频分析中是至关重要的部分,先前的视频文件只是单纯的测试目的,真正实用的部分还是需要接上摄像头或网络的视频流,这样才能应用到实际的工作场景。本文的内容就是带领读者将摄像头与RTSP流接入容器内使用,搭建具有实用价值的容器。

  1. 接入摄像头

第一件任务就是要判断摄像头的种类与数量,用最简单的“ls /dev/video*”指令并不能分辨其种类,因此最好的方法还是使用v4l2工具。请先执行以下指令安装这个工具:

$

sudo  apt  install  -y  v4l-utils

安装好之后,请执行以下指令:

$

v4l2-ctl  --list-devices

如果检测到以下“imx219”之类的信息,表示这个摄像头为CSI类型:

Orin开发套件09-为容器接入USB摄像头

如果检测到以下“USB Camera”信息的,就表示为USB摄像头:

Orin开发套件09-为容器接入USB摄像头

Jetson Orin开发套件的USB摄像头都会占用2video口,例如上图中的一台USB摄像头占用video0video1两个端口,但实际能调用作为输入功能的是第一个video0的编号,如果设备上有多个摄像头的时候,就需要特别注意这些细节。

由于CSI摄像头与USB摄像头的调用方式不同,因此在创建Docker容器时,需要使用以下两种不同的映射方式将设备指到容器内使用:

  • CSI摄像头:使用“-v  /tmp/argus_socket:/tmp/argus_socket”方式进行映射;
  • USB摄像头:使用“--device /dev/video<N>”方式进行映射,如果有多个USB摄像头则可以使用“--device /dev/video<N1> --device /dev/video<N2> ...”方式添加到容器内。

这些摄像头加到容器之后,会发现容器内的编号与容器外是对应的,例如原本video0video2两个USB摄像头,进到容器之后同样为video0video2的编号。

由于Jetson Orin开发套件的CSI摄像头比较特殊,因此这里使用两个USB摄像头来做演示,并以nvcr.io/nvidia/deepstream-l4t:6.1-samples镜像来创建执行容器,如果您按照前面文章将samples内容复制到容器外的话,请执行以下指令:

$

$

sudo xhost +si:localuser:root

docker run -it --net=host --runtime=nvidia -e DISPLAY=$DISPLAY \

-w /opt/nvidia/deepstream/deepstream -v /tmp/.X11-unix/:/tmp/.X11-unix \

-v ~/deepstream/samples:/opt/nvidia/deepstream/deepstream/samples \

--device /dev/video0 --device /dev/video2  nvcr.io/nvidia/deepstream-l4t:6.1-samples

现在进入容器后先检查摄像头数量,请执行以下指令:

$

$

apt  install  -y  v4l-utils

v4l2-ctl  --list-devices

会看到如下的信息,表示有两个USB摄像头:

Orin开发套件09-为容器接入USB摄像头

这样就能在容器内调用摄像头来进行工作。

  1. 执行容器内deepstream-app调用USB摄像头

在容器内用deepstream-app进行演示,使用samples/config/deepstream-app下的source1_usb_dec_infer_resnet_int8.txt配置文件,不过需要对配置文件进行以下的修改:

  • [tiled-display]设置组的columns设为2,配合两个摄像头的显示;
  • 确认[source0]设置组最后的camera-v4l2-dev-node设为0
  • [source0]设置组复制一份为[source1],将camera-v4l2-dev-node设为2
  • [sink0]设置组的type设为2

主要修改部分如下:

[tiled-display]

...

columns=2

...

[source0]

...

camera-v4l2-dev-node=0

# [source0]内容复制一份成下面的[source1],并修改节点编号

[source1]

...

camera-v4l2-dev-node=2

...

[sink0]

...

type=2

修改完后,就在容器内执行以下指令:

$

$

cd  samples/config/deepstream-app

deepstream-app  -c  source1_usb_dec_infer_resnet_int8.txt

就应该能看到显示两个摄像头的画面。

Orin开发套件09-为容器接入USB摄像头

  1. 执行容器内Python调用USB摄像头范例

如果您已经按照前面文章创建支持Python开发环境的DeepStream容器,现在就可以用前面存好的deepstream-l4t:6.1-python镜像创建ds_python容器,如果还没有创建好的话,请参考前一篇文章中去调试Python执行环境。

现在执行以下指令,使用deepstream-l4t:6.1-python镜像创建可执行Python范例的容器:

$

$

 

 

 

 

$

sudo xhost +si:localuser:root

docker run -id --net=host --name=ds_python --runtime=nvidia -e DISPLAY=$DISPLAY \

-w /opt/nvidia/deepstream/deepstream  -v /tmp/.X11-unix/:/tmp/.X11-unix \

-v  ~/deepstream/deepstream/sources:/opt/nvidia/deepstream/deepstream/sources \

-v  ~/deepstream/deepstream/samples:/opt/nvidia/deepstream/deepstream/samples \ --device /dev/video0  --device /dev/video2  deepstream-l4t:6.1-python

docker exec -it ds_python bash

进入容器后,先使用以下指令检查摄像头是否完成连接:

$

$

apt  install  -y  v4l-utils

v4l2-ctl  --list-devices

如果看到如下的信息,表示有两个USB摄像头:

Orin开发套件09-为容器接入USB摄像头

现在使用Python范例的deepstream-test1-usbcam项目来执行USB摄像头的测试,请执行以下指令:

$

$

cd sources/deepstream_python_apps/apps/deepstream-test1-usbcam/

./deepstream_test_1_usb.py /dev/video0

这样就能在容器内调用USB摄像头。

来源:业界供稿

0赞

好文章,需要你的鼓励

2022

08/30

16:06

分享

点赞

邮件订阅