问题描述

   笔者在桌面级设备上训练了一个视频信号处理模型,使用Pytorch,Torchvision,OpenCV等外部库。前向推导程序在桌面级设备Linux和Windows系统上均运行良好,无报错。

   最近希望将这个模型移植到Jetson nano上,以增强移动性来扩展应用场景。

   Jetson nano 环境概要:

  1. Python==3.6 (conda virual env)
  2. 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的依赖文件缺失。

解决方案

  1. 确认Jetson nano是否已安装GStreamer-1.0库;这个库可能在标准的Ubuntu系统中自带,但在Jetson系统中未安装。
gst-inspect-1.0 --version

   笔者的系统报了“Command not found”的错误,看来猜想是对的,需要安装GStreamer-1.0库。

  1. 依次在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就不用管。

  1. 检验是否安装成功:
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
  1. 再跑一遍包含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()

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐