jetson orin nano super AI模型部署之路(六)docker内使用usb摄像头
Published:
1. 在host上接入摄像头
第一件任务就是要判断摄像头的种类与数量,用最简单的 “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 的编号,如果设备上有多个摄像头的时候,就需要特别注意这些细节。
2. 相关配置
2.1 确认 DISPLAY 环境变量(关键步骤)
在host上执行
export DISPLAY=:0 # 默认本地显示器(常见于物理机直接操作)
2.2 配置 X Server 访问权限
安装 X11 基础工具(宿主机和容器内均需要):
sudo apt install x11-xserver-utils xauth x11-apps libgl1-mesa-glx libgtk-3-0
# 在宿主机(非容器内)执行以下命令
xhost +local:docker # 允许所有本地 Docker 容器访问 X 服务
检查 X 服务是否运行:
ps aux | grep Xorg # 确认 Xorg 进程存在
3. docker run指令
确保 Docker 命令包含必要的 X11 参数:
docker run -it \
--env DISPLAY=$DISPLAY \
--volume /tmp/.X11-unix:/tmp/.X11-unix \
--device /dev/video0 \ # 若使用摄像头
your_image
完整的指令如下:
sudo docker run --runtime nvidia --gpus all --net host --ipc host -it \
--device /dev/video0 --device /dev/video1 --name yolo_usb3 \
-v /home:/home -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix \
dustynv/nanoowl:r36.4.0_my
进入到docker container后,记得安装 X11基础工具:
sudo apt install x11-xserver-utils xauth x11-apps libgl1-mesa-glx libgtk-3-0
4. docker container内测试
在container中,执行
xclock # 若弹出时钟窗口,则 X11 转发成功
此时应该会弹出一个时钟的窗口。若弹出,代表X11服务从host到docker转发成功。
如果使用opencv打开usb摄像头,一定记得使用cap = cv2.VideoCapture(0, cv2.CAP_V4L2)
来打开摄像头。