使用 OpenCV VideoWriter 保存灰度图像时出现 Gstreamer 错误

Posted

技术标签:

【中文标题】使用 OpenCV VideoWriter 保存灰度图像时出现 Gstreamer 错误【英文标题】:Gstreamer error in saving grayscale image with OpenCV VideoWriter 【发布时间】:2021-04-20 12:22:33 【问题描述】:

我可能遗漏了一些非常明显的东西,但我似乎无法完成这项工作。 我正在从灰度相机读取帧,然后我想通过 OpenCV VideoWriter 中的 gstreamer 将其编码为 H265。

这是我的 gstreamer 管道:

gst_out =('appsrc caps=video/x-raw,format=GRAY8,width=1280,height=800,framerate=30/1 ! '
    'videoconvert ! omxh265enc ! video/x-h265, stream-format=byte-stream ! '
    'h265parse ! filesink location=test.h265 ')

writer= cv2.VideoWriter(gst_out, cv2.CAP_GSTREAMER, 0, 30, (1280, 800), True)

但是当我尝试在其中写入帧时,我得到了错误

[ WARN:0] global /home/nvidia/host/build_opencv/nv_opencv/modules/videoio/src/cap_gstreamer.cpp (1629) writeFrame OpenCV | GStreamer warning: cvWriteFrame() needs images with depth = IPL_DEPTH_8U and nChannels = 3.

我不明白,因为它应该接受 GRAY8 格式,并且我已验证该帧仅作为一个通道。如果我将帧转换为 BGR,它可以工作,但这不是我想要的,因为我只需要保存灰度图像,而且我也不明白为什么当我在管道中指定 GRAY8 时它会接受 BGR 帧。

非常感谢任何帮助。

【问题讨论】:

如果您打算创建灰度视频,那么为什么要构造cv2.VideoWriter 并将isColor 参数设置为True 天哪,你是对的!我知道我在某个地方犯了一些愚蠢的错误,我现在觉得很愚蠢。非常感谢! 别担心,它发生了:) 我认为@DanMašek 应该写这个作为答案,并且 OP 应该接受它:-) @JonasVautherin 去吧,如果你喜欢它。我很忙,并没有动力去做那件事。 ;) 【参考方案1】:

您正在构建您的cv::VideoWriter 并将isColor 设置为true

VideoWriter (const String &filename, int fourcc, double fps, Size frameSize, bool isColor=true)

这就是为什么 OpenCV 需要彩色图像(具有 3 个通道)而不是灰度图像。

(注意:这在 cmets 中已经讨论过了,我只是为了结束问题而写它作为答案)

【讨论】:

感谢您的回复!我按照你的建议接受了:)

以上是关于使用 OpenCV VideoWriter 保存灰度图像时出现 Gstreamer 错误的主要内容,如果未能解决你的问题,请参考以下文章

C# OpenCV VideoWriter 以意想不到的颜色保存

OpenCV VideoWriter 不写任何东西

使用 videowriter opencv 的视频大小为 0 字节

opencv-videowriter

OpenCV videowriter 不写视频

OpenCV:来自 VideoWriter 的写入是不是应该在独立线程中运行?