无法在Jetson Xavier中使用python中的OpenCV捕获视频

无法在Jetson Xavier中使用python中的OpenCV捕获视频,python,opencv,gstreamer,nvidia-jetson,jetson-xavier,Python,Opencv,Gstreamer,Nvidia Jetson,Jetson Xavier,我试图在Jetson Xavier(Ubuntu18)上读取相机图像。我面临一个问题。当我运行下面的代码时,它会给出一个警告并给出一个黑色(完整)图像 [WARN:0]全局/home/nvidia/host/build_opencv/nv_opencv/modules/videoio/src/cap_gstreamer.cpp(933)opencv | gstreamer警告:无法查询视频位置:状态=0,值=-1,持续时间=-1 如果我使用“dev/video0”读取图像,即 cam=cv2.V

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

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

如果我使用“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]全局/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的新手,请引导我。谢谢

您可以尝试以下代码。还要确保您已从源代码处安装了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()

这可能类似于?它固定在那里,带有标志
cv2.CAP\u V4L2
VideoCapture(0,cv2.CAP\u V4L2)
,您也可以试试。@yunustmurlenk谢谢。现在我没有收到GStreamer的警告,但图像是黑色的。当连接到Windows PC时,图像非常完美。我删除了代码中的灰线,并显示了帧的原样,它正在工作。我可以在代码中检查的唯一区别是while循环。为什么这是工作和我的不是?是的,唯一的区别是while循环。您正在从视频中捕获帧,而不是连续读取帧,因此代码无法正常工作。当你从视频/网络摄像机中捕获帧时,你必须在while循环中加入read函数才能连续捕获帧。。。第一帧始终是黑色的,下一帧是精细的。所以我只是在读第一帧。读取第一帧的原因是为了检查摄像头的图像,而不是读取视频。但奇怪的是,第一帧是黑色的。你试过给相机一些预热时间吗?在捕获帧之前使用time.sleep(0.01)。这件事是在raspberry pi 3b上的raspberry pi摄像机上进行的。是的。它工作了半个多小时。
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()