【问题标题】:How to use OpenCV with camera on Jetson Nano with Yocto/poky如何通过 Yocto/poky 在 Jetson Nano 上使用 OpenCV 和摄像头
【发布时间】:2020-01-19 05:56:07
【问题描述】:

我在 Jetson Nano 上使用 Warriors 分支(poky Warriors、meta-tegra Warriors-l4t-r32.2、openembedded Warriors)和 CUDA 10 创建了一个最小的 xfce 映像。

图像启动并运行完美,相机测试:

$ gst-launch-1.0 nvarguscamerasrc ! 'video/x-raw(memory:NVMM),width=3820, height=2464, framerate=21/1, format=NV12' ! nvvidconv flip-method=0 ! 'video/x-raw,width=960, height=616' ! nvvidconv ! nvegltransform ! nveglglessink -e

像魅力一样工作。

现在我想在相机源上使用 OpenCV,但我无法让它工作。

我已将这些包添加到IMAGE_INSTALL

...
opencv \
libopencv-core \
libopencv-imgproc \
opencv-samples \
gstreamer1.0-omx-tegra \
python3 \
python3-modules \
python3-dev \
python-numpy \
...

安装 OpenCV。当我运行 /usr/bin/opencv_version 时,它返回版本 3.4.5,python 版本是 3.7.2,GCC 版本是 7.2.1。

当我尝试运行 this OpenCV test code 时,它会返回

[ WARN:0] VIDEOIO(createGStreamerCapture(filename)): trying ...

(python3.7:5163): GStreamer-CRITICAL **: ..._: gst_element_get_state: assertion 'GST_IS_ELEMENT (element)' failed
[ WARN:0] VIDEOIO(createGStreamerCapture(filename)): result=(nil) isOpened=-1 ...

Unable to open camera

我尝试在网上四处寻找解决方案,但它们似乎不起作用。

编辑: 在 VideoCapture 函数中使用 CAP_GSTREAMER 似乎确实存在问题,因为使用 CAP_FFMPEG 运行相同的程序在 mp4 视频上运行良好。

使用 cv2.VideoCapture("/dev/video0", CAP_FFMPEG) 只会返回 isOpen=-1。如何让相机在 python 中打开?

【问题讨论】:

    标签: python opencv yocto nvidia-jetson nvidia-jetson-nano


    【解决方案1】:

    这是您所说的适合您的管道:

    gst-launch-1.0 -v nvarguscamerasrc ! 'video/x-raw(memory:NVMM),width=3820, height=2464, framerate=21/1, format=NV12' ! nvvidconv flip-method=0 ! 'video/x-raw,width=960, height=616' ! nvvidconv ! nvegltransform ! nveglglessink -e
    

    这是脚本中提到的管道:

    gst-launch-1.0 -v nvarguscamerasrc ! 'video/x-raw(memory:NVMM),width=3280, height=2464, framerate=21/1, format=NV12' ! nvvidconv flip-method=0 ! 'video/x-raw, width=820, height=616, format=BGRx' ! videoconvert ! video/x-raw, format=BGR ! appsink
    

    工作管道和非工作管道的区别在于添加了videoconvertappsink 错误 GStreamer-CRITICAL **: ..._: gst_element_get_state: assertion 'GST_IS_ELEMENT (element)' failed 表示您的系统中缺少一些 GStreamer 元素。您可以尝试通过将以下包组添加到您的图像来添加缺少的插件:

    gstreamer1.0-plugins-base
    

    或者,您可以将 face_detect.py 中的管道替换为您的工作管道,但请记住,脚本可能需要先将视频转换为 BGR,然后再将其提供给 appsink 以使算法正常工作。您可能需要查找 nvidconv 元素的文档以查看是否支持。

    编辑:从您的评论来看,您可能也错过了gstreamer1.0-python

    【讨论】:

    • 当我尝试运行 bitbake gstreamer1.0-plugin-base 时,它说它已经构建,因此必须是图像的一部分。而且我还尝试采用有效的管道并替换 face_detect.py 管道,但仍然出现相同的错误......这是一个非常令人沮丧的问题,因为我知道相机和 OpenCV 都可以工作 - 只是目前不在一起。
    • 当我尝试运行gst-launch-1.0 -v nvarguscamerasrc ! 'video/x-raw(memory:NVMM),width=3280, height=2464, framerate=21/1, fflip?methodormat=NV12' ! nvvidconv flip-method=0 ! 'video/x-raw, width=820, height=616, format=BGRx' ! videoconvert ! video/x-raw, format=BGR ! appsink它返回WARNING: erroneous pipeline: no element "videoconvert"
    • 我想我错过了一些依赖或什么?我只是不知道此时需要如何或需要什么
    • 我做了同样的错误,这就是我尝试添加所有其他内容的原因。无论如何,我删除了我的“答案”,但您认为也许其他 gstream 包:gstreamer1.0-plugins-good \ gstreamer1.0-plugins-bad \ gstreamer1.0-plugins-ugly \ gstreamer1.0-python \ 可能对其工作产生一些影响?
    • @MichaelChristensen 这真的取决于你的管道。这就是为什么我在已删除的评论中要求查看“-v”的输出(如果可以,您可以尝试上传到 pastebin)。作为附带提示,您还可以在插件上调用 gst-inspect-1.0。通过观察你的管道,我猜你需要gstreamer1.0-plugins-basegstreamer1.0-omx-tegragstreamer1.0-python。我认为其余的都是不必要的。
    【解决方案2】:

    使用以下 gstreamer 管道:

    stream = 'nvarguscamerasrc ! video/x-raw(memory:NVMM), width=%d, height=%d, format=(string)NV12, framerate=(fraction)%d/1 !nvvidconv flip-method=%d ! nvvidconv !视频/x-raw,宽度=(int)%d,高度=(int)%d,格式=(字符串)BGRx!视频转换!应用程序的百分比 (1280, 720, 30,0, 640, 480)

    cap = cv2.VideoCapture(stream,cv2.CAP_GSTREAMER)

    这样就可以解决问题了

    【讨论】:

      猜你喜欢
      • 2022-07-17
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      • 2020-02-04
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      • 2020-10-26
      相关资源
      最近更新 更多