从使用 gstreamer 读取的相机显示时丢失帧

问题描述 投票:0回答:1

我正在尝试显示和保存来自 FLIR Hadron 相机的视频,我在 Python 3 OpenCV 中使用 GStreamer,它成功显示并保存了来自 BOSON 的红外视频,但我在 RGB 视频中丢失了帧,这导致显示缓慢和播放快速,并尝试向GStreamer管道添加各种命令,例如videorate,以控制fps,但没有任何帮助。

我在执行代码时检查它只使用 Jetson Nano 的 CPU 部分,所以我安装了 CUDA 以便能够使用 GPU,但我不知道我必须在代码中添加什么强制它使用计算机的 GPU。

这里是显示和保存的RGB代码:

import cv2

camset=‘v4l2src io-mode=4 device=/dev/video0 do-timestamp=true ! video/x-raw,format=UYVY,width=1920,height=1080,framerate=30/1 ! queue ! videoconvert ! videorate ! video/x-raw,format=BGR ! appsink drop=1’

cap=cv2.VideoCapture(capset,cv2.CAP_GSTREAMER)
if cap.isOpened() is not True:
print(“Cannot open camera. Exiting.”)
quit()
actual_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
actual_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
actual_fps = float(cap.get(cv2.CAP_PROP_FPS));
print(‘Capture opened framing %d x %d @ %f’ % (actual_width,actual_height,actual_fps))

gst_writer_str = ‘appsrc ! video/x-raw,format=BGR,width=1920,height=1080,framerate=30/1 ! queue ! videoconvert ! video/x-raw,format=BGRx ! nvvidconv ! nvv4l2h265enc maxperf-enable=1 preset-level=4 control-rate=1 bitrate=14000000 ! h265parse ! qtmux ! filesink location=streaming.mp4’
fourcc = 0 #RAW
out = cv2.VideoWriter(gst_writer_str, cv2.CAP_GSTREAMER, fourcc, actual_fps, (actual_width, actual_height), True)
if not out.isOpened():
print(“Cannot open writer. Exiting.”)
quit()

while (True):
ret,frame = cap.read()
cv2.imshow(‘camera’,frame)
out.write(frame)
if cv2.waitKey(1) & 0XFF == ord(‘q’):
break
out.release()
cap.release()
cv2.destroyAllWindows()
python opencv gstreamer nvidia-jetson-nano
1个回答
0
投票

我在执行代码时检查它仅使用 Jetson Nano 的 CPU 部分,因此我安装了 CUDA 以便能够使用 GPU,但我不知道我必须在代码中添加什么强制它使用计算机的 GPU。

使用 GPU 与 OpenCv CUDA 处理是可能的,但这对你的情况没有帮助,因为你没有处理循环中的帧,只是从 gstreamer 读取并推送到 gstreamer 并使用 imshow 显示。

使用 gstreamer,您可以更好地使用 Jeston 的专用硬件,例如由 nvvidconv 元素驱动的 NVENC(硬件编码器,不适用于 Orin Nano)、NVDEC(硬件解码器)和 VIC(用于调整大小、裁剪或转换为其他格式)还可以在 NVMM 内存(可用于硬件块的 DMA)和系统内存之间进行复制。

imshow
可能是 Jetson Nano 在高分辨率和帧速率下的瓶颈。您可以尝试降低这些并检查是否有所改善。

另一种方法是使用带有显示接收器的 opencv VideoWriter,例如以下管道:

display_writer = cv2.VideoWriter('appsrc ! video/x-raw,format=BGR,width=1920,height=1080,framerate=30/1 ! queue ! videoconvert ! video/x-raw,format=I420 ! xvimagesink', cv2.CAP_GSTREAMER)

# Or:
display_writer = cv2.VideoWriter('appsrc ! video/x-raw,format=BGR,width=1920,height=1080,framerate=30/1 ! queue ! videoconvert ! video/x-raw,format=BGRx ! nvvidconv ! nvoverlaysink', cv2.CAP_GSTREAMER)

# Or:
display_writer = cv2.VideoWriter('appsrc ! video/x-raw,format=BGR,width=1920,height=1080,framerate=30/1 ! queue ! videoconvert ! video/x-raw,format=BGRx ! nvvidconv ! video/x-raw(memory:NVMM),format=I420 ! nvvidconv ! video/x-raw ! xvimagesink', cv2.CAP_GSTREAMER)

使用这些管道之一和与写入文件的参数相同的参数创建第二个 VideoWriter,并检查它是否已成功打开。

在循环中,您将删除 imshow 并将帧写入显示写入器。

© www.soinside.com 2019 - 2024. All rights reserved.