【问题标题】:Cannot capture video using OpenCV in python in Jetson Xavier无法在 Jetson Xavier 的 python 中使用 OpenCV 捕获视频
【发布时间】:2021-07-14 02:58:15
【问题描述】:

我正在尝试读取 Jetson Xavier (ubuntu 18) 上的相机图像。我面临一个问题。当我运行以下代码时,它会发出警告并给出黑色(完整)图像。

[WARN:0] 全局 /home/nvidia/host/build_opencv/nv_opencv/modules/videoio/src/cap_gstreamer.cpp (933) 打开 OpenCV | GStreamer 警告:无法查询视频位置:状态=0,值=-1,持续时间=-1

cam=cv2.VideoCapture(0)
if cam.isOpened():
    grab,img = cam.read()
    if grab is True:
        cv2.imshow('sample image',img)
    else:
        print(f"Image not found")
else:
    print("Camera not openedd")
       

cv2.waitKey(0) # waits until a key is pressed
cv2.destroyAllWindows() # destroys the window showing image

如果我使用 'dev/video0' 来读取图像,即

cam=cv2.VideoCapture('dev/video0')

我收到未打开相机的警告和自定义错误消息

[WARN:0] 全局 /home/nvidia/host/build_opencv/nv_opencv/modules/videoio/src/cap_gstreamer.cpp (711) 打开 OpenCV | GStreamer 警告:打开 bin 时出错:没有元素“dev” [WARN:0] global /home/nvidia/host/build_opencv/nv_opencv/modules/videoio/src/cap_gstreamer.cpp (480) isPipelinePlaying OpenCV | GStreamer 警告:GStreamer:尚未创建管道 相机未打开

然后我创建了 gstream 字符串并将其传递给视频捕获,如下所示。 字符串如下

gstr = 'varguscamerasrc ! video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, format=(string)NV12, framerate=(fraction)60/1 ! nvvidconv flip-method=0 ! video/x-raw, width=(int)1280, height=(int)720, format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink'

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

我收到以下错误

Error generated. /dvs/git/dirty/git-master_linux/multimedia/nvgstreamer/gst-nvarguscamera/gstnvarguscamerasrc.cpp, execute:645 No cameras available

(python3:15402): GStreamer-CRITICAL **: 19:08:54.835: gst_mini_object_set_qdata: assertion 'object != NULL' failed
[ WARN:0] global /home/nvidia/host/build_opencv/nv_opencv/modules/videoio/src/cap_gstreamer.cpp (933) open OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1
Traceback (most recent call last):

我是jetson的新手,请指导我。谢谢

【问题讨论】:

  • 这可能类似于this problem ?里面固定有cv2.CAP_V4L2,VideoCapture(0,cv2.CAP_V4L2)的flag,你也可以试试。
  • @YunusTemurlenk 谢谢。现在我没有收到 GStreamer 的警告,但图像是黑色的。连接到 Windows PC 时图像完美。

标签: python opencv gstreamer nvidia-jetson jetson-xavier


【解决方案1】:

你可以试试下面的代码。还要确保您已从源代码安装 OpenCV,而不是使用 pip,因为 Jetson Nano 和 Xavier 在您从 pip 安装 OpenCV 时会出现一些问题。

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

【讨论】:

  • 我删除了代码中的灰线并按原样显示框架并且它正在工作。我可以检查我的代码的唯一区别是while循环。为什么这行得通而我的不行?
  • 是的,唯一的区别是 while 循环。您正在从视频中捕获帧而不是连续读取它们,因此您的代码无法正常工作。当您从视频/网络摄像头捕获帧时,您必须将读取功能放入 while 循环中才能连续捕获帧。
  • 实际上发生的事情是......第一帧总是黑色的,接下来的帧很好。所以我只是在阅读第一帧。读取第一帧的原因是只是为了检查相机的图像而不是读取视频。但还是很奇怪,第一帧是黑色的。
  • 您是否尝试过给相机一些预热时间?通过在捕获帧之前使用 time.sleep(0.01)。这个东西在树莓派 3b 上的树莓派相机上工作。
  • 是的。它工作了半个多小时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
相关资源
最近更新 更多