无法在Jetson Xavier中使用python中的OpenCV捕获视频
我试图在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”读取图像,即无法在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
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()