You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetson Nano上OpenCV VideoCapture在Python3.6可用但3.7不可用

Jetson Nano下Python3.7 + OpenCV无法读取摄像头帧的解决方案

问题背景

在Jetson Nano上,使用默认Python3.6时,通过以下GStreamer管道初始化OpenCV视频捕获正常:
cam=cv2.VideoCapture("nvarguscamerasrc ! video/x-raw(memory:NVMM), width=(int)1640, height=(int)1232,format=(string)NV12, framerate=(fraction)30/1 ! nvvidconv ! video/x-raw, format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink")

切换到Python3.7后,cam.read()返回False,无法抓取帧,无报错信息,OpenCV版本为4.9.0.80。

核心原因

Python3.7环境下的OpenCV大概率未编译GStreamer支持,或缺少Jetson硬件加速相关配置。JetPack自带的Python3.6绑定的OpenCV是预编译好的,默认包含GStreamer和CUDA加速支持,而自行安装的Python3.7对应的OpenCV通常默认不开启这些选项。

解决步骤

1. 检查OpenCV的GStreamer支持状态

运行以下代码,查看OpenCV编译信息中的GStreamer项:

import cv2
print(cv2.getBuildInformation())

在输出中找到GStreamer部分,如果显示NO,则确认是缺少GStreamer支持导致的问题。

2. 重新编译适配Python3.7的OpenCV(带GStreamer和硬件加速)

安装依赖

sudo apt-get update && sudo apt-get install -y \
build-essential cmake git libgtk2.0-dev pkg-config \
libavcodec-dev libavformat-dev libswscale-dev \
libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
libjpeg-dev libpng-dev libtiff-dev \
python3.7-dev python3-pip

下载OpenCV及扩展模块

git clone https://github.com/opencv/opencv.git -b 4.9.0
git clone https://github.com/opencv/opencv_contrib.git -b 4.9.0
cd opencv && mkdir build && cd build

配置CMake编译参数

cmake -D CMAKE_BUILD_TYPE=RELEASE \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D INSTALL_PYTHON_EXAMPLES=ON \
      -D INSTALL_C_EXAMPLES=OFF \
      -D WITH_GSTREAMER=ON \
      -D WITH_CUDA=ON \
      -D CUDA_ARCH_BIN=5.3 \
      -D CUDA_ARCH_PTX="" \
      -D WITH_CUDNN=ON \
      -D OPENCV_DNN_CUDA=ON \
      -D ENABLE_FAST_MATH=1 \
      -D CUDA_FAST_MATH=1 \
      -D WITH_CUBLAS=1 \
      -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
      -D HAVE_opencv_python3=ON \
      -D PYTHON_EXECUTABLE=/usr/bin/python3.7 \
      -D BUILD_EXAMPLES=ON ..

编译并安装

make -j4  # Jetson Nano使用4线程编译,避免资源耗尽
sudo make install
sudo ldconfig

3. 验证GStreamer管道可用性

先在终端直接运行GStreamer命令,确认摄像头硬件和管道本身无问题:

gst-launch-1.0 nvarguscamerasrc ! video/x-raw(memory:NVMM),width=1640,height=1232,format=NV12,framerate=30/1 ! nvvidconv ! video/x-raw,format=BGRx ! videoconvert ! video/x-raw,format=BGR ! autovideosink

如果能正常显示摄像头画面,说明GStreamer环境正常,只需确保OpenCV绑定正确即可。

4. 临时替代方案:使用V4L2直接读取

如果暂时无法重新编译OpenCV,可以尝试用V4L2接口直接读取摄像头(无硬件加速,帧率可能较低):

cam = cv2.VideoCapture("/dev/video0", cv2.CAP_V4L2)
cam.set(cv2.CAP_PROP_FRAME_WIDTH, 1640)
cam.set(cv2.CAP_PROP_FRAME_HEIGHT, 1232)
cam.set(cv2.CAP_PROP_FPS, 30)

ret, frame = cam.read()
if not ret:
    print("Failed to grab initial frame. Fix camera!")
    sys.exit()

内容的提问来源于stack exchange,提问作者Gray Fox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 01:18:26