0

我正在尝试使用此处显示的 4k 相机为我的 AI 应用程序捕获原始 4k 图像。我想每 5 秒捕获一帧并将其存储为 .png 文件,稍后我将通过我的神经网络运行以进行检测。我知道以原始格式 (.mkv) 录制 4k 视频的命令。但是,我无法以 3840x2160 分辨率捕获单个图像(帧)。

有一个示例命令是

gst-launch-1.0 nvarguscamerasrc sensor-id=0 num-buffers=1 ! "video/x-raw(memory:NVMM),format=(string)NV12, width=(int)3840, height=(int)2160" ! nvjpegenc ! filesink location=test.jpg 

上面的命令有效,但它只存储在大小约为 1mb 的 jpg 中。这不是很清楚,我想要一个更详细的 png 格式。我尝试更改文件名中的扩展名,但它不起作用。我正在使用jetson xavier nx。

编辑 我尝试使用以下命令更改编码

gst-launch-1.0 nvarguscamerasrc sensor-id=0 num-buffers=1 ! "video/x-raw(memory:NVMM), format=(string)NV12, width=(int)3840, height=(int)2160" ! pngenc ! filesink location=test1.png

但是我收到以下错误

WARNING: erroneous pipeline: could not link nvarguscamerasrc0 to pngenc0, pngenc0 can't handle caps video/x-raw(memory:NVMM), format=(string)NV12, width=(int)3840, height=(int)2160

4

1 回答 1

0

您只需要将图像从 NVMM 内存中的 Argus 复制到系统内存中。nvvidconv 插件可用于:

gst-launch-1.0 nvarguscamerasrc sensor-id=0 num-buffers=1 ! "video/x-raw(memory:NVMM), format=(string)NV12, width=(int)3840, height=(int)2160" ! nvvidconv ! pngenc ! filesink location=test1.png

但是,除非另有说明,否则 argus 会自动调整许多参数,因此根据您的场景,第一帧可能很暗。在这种情况下,您可以捕获 21 张图像并使用 multifilesink 以便在 1 秒后保留第 21 张图像,然后将其转换为 png:

gst-launch-1.0 nvarguscamerasrc sensor-id=0 num-buffers=21 ! 'video/x-raw(memory:NVMM), format=NV12, width=3840, height=2160, framerate=21/1' ! nvvidconv ! video/x-raw,format=RGBA ! multifilesink location=test1.rgba max-files=1

gst-launch-1.0 filesrc location=test1.rgba ! videoparse format=rgba width=3840 height=2160 framerate=0/1 ! pngenc ! filesink location=test1.png

请注意,使用 Jetson 时 pngenc 的速度不是很快。

于 2021-11-20T15:42:05.857 回答