为容器接入USB摄像头

描述

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

 

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

 

1、接入摄像头

 

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

 

  •  
sudo  apt   install  -y  v4l-utils

 

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

 

  •  
v4l2-ctl  --list-devices

 

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

 

摄像头

 

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

 

摄像头

 

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

 

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

 

  • CSI 摄像头:使用 “-v  /tmp/argus_socket:/tmp/argus_socket” 方式进行映射;

  • USB 摄像头:使用 “--device/dev/video” 方式进行映射,如果有多个 USB 摄像头则可以使用 “--device /dev/video --device /dev/video ...” 方式添加到容器内。

 

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

 

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

 

  •  
  •  
  •  
  •  
  •  
sudo xhost +sirootdocker 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-utilsv4l2-ctl  --list-devices

 

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

 

摄像头

 

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

 

2、执行容器内 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-appdeepstream-app  -c  source1_usb_dec_infer_resnet_int8.txt

 

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

 

摄像头

 

3、执行容器内 Python 调用 USB 摄像头范例

 

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

 

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

 

  •  
  •  
  •  
  •  
  •  
  •  
sudo xhost +sirootdocker 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-pythondocker exec -it ds_python bash

 

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

 

  •  
  •  
apt  install  -y  v4l-utilsv4l2-ctl  --list-devices

 

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

 

摄像头

 

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

 

  •  
  •  
cd sources/deepstream_python_apps/apps/deepstream-test1-usbcam/./deepstream_test_1_usb.py /dev/video0

 

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

 

 审核编辑:汤梓红
 
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分