问题描述
笔者在桌面级设备上训练了一个视频信号处理模型,使用Pytorch,Torchvision,OpenCV等外部库。前向推导程序在桌面级设备Linux和Windows系统上均运行良好,无报错。
最近希望将这个模型移植到Jetson nano上,以增强移动性来扩展应用场景。
Jetson nano 环境概要:
- Python==3.6 (conda virual env)
- torch==1.11.0, torchvision==0.12.0, opencv-python==4.11.0.86.
在解决了程序所需的外部库的安装后,发现运行前向推导程序时,出现了如下报错:
Opening in BLOCKING MODE
NvMMLiteOpen : Block : BlockType = 261
NVMEDIA: Reading vendor.tegra.display-size : status: 6
NvMMLiteBlockCreate : Block : BlockType = 261
[ WARN:0@13.696] global cap_gstreamer.cpp:2830 handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module qtdemux0 reported: Internal data stream error.
[ WARN:0@13.708] global cap_gstreamer.cpp:1698 open OpenCV | GStreamer warning: unable to start pipeline
[ WARN:0@13.708] global cap_gstreamer.cpp:1173 isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created
最终,该报错导致的结果是:cv2.VideoCapture()语句无法正常运行,即无法调取Jetson nano的摄像头,也无法读取本地mp4或者avi文件。
这个代码在桌面端运行良好,无任何报错或警告,因此,初步确定不是代码的问题,可能是Jetson nano中OpenCV外部库有关GStreamer的依赖文件缺失。
解决方案
- 确认Jetson nano是否已安装GStreamer-1.0库;这个库可能在标准的Ubuntu系统中自带,但在Jetson系统中未安装。
gst-inspect-1.0 --version
笔者的系统报了“Command not found”的错误,看来猜想是对的,需要安装GStreamer-1.0库。
- 依次在Terminal中输入以下命令:
sudo apt-get update
sudo apt-get install gstreamer1.0-tools gstreamer1.0-alsa \
gstreamer1.0-plugins-base gstreamer1.0-plugins-good \
gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly \
gstreamer1.0-libav
sudo apt-get install libgstreamer1.0-dev \
libgstreamer-plugins-base1.0-dev \
libgstreamer-plugins-good1.0-dev \
libgstreamer-plugins-bad1.0-dev
此步骤会弹出大量提示信息,只要没有ERROR就不用管。
- 检验是否安装成功:
gst-inspect-1.0 --version
出现如下信息,则说明已经安装成功。
gst-launch-1.0 version 1.14.5
GStreamer 1.14.5
https://launchpad.net/distros/ubuntu/+source/gstreamer1.0
- 再跑一遍包含OpenCV的代码,有一条警告,但是已经没有报错,程序正常运行。
附件:测试程序
import cv2
test_method = 'file'
if test_method == 'file':
# 使用视频文件路径来打开视频文件
cap = cv2.VideoCapture('path_to_your_video_file.avi')
else:
# 使用 V4L2 后端打开摄像头
cap = cv2.VideoCapture(0, cv2.CAP_V4L2)
# 检查视频是否成功打开
if not cap.isOpened():
print("Error: Unable to open video file.")
else:
while True:
ret, frame = cap.read()
if not ret:
print("Error: Failed to read frame or end of video reached.")
break
# 显示视频帧
cv2.imshow("Video", frame)
# 按 'q' 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源并关闭窗口
cap.release()
cv2.destroyAllWindows()