OpenCV 填充垫,与 VideoWriter 一起使用

Posted

技术标签:

【中文标题】OpenCV 填充垫,与 VideoWriter 一起使用【英文标题】:OpenCV padded Mat, use with VideoWriter 【发布时间】:2016-04-28 07:41:15 【问题描述】:

我有一个使用 3 字节颜色值的二维数组表示的图像(OpenCV 类型 CV_8UC3)。数组不是密集打包的,而是元素在 4 字节边界上对齐,即有 1 字节的填充。

所以数组的格式是

RGB_RGB_RGB_RGB_RGB_RGB_RGB_RGB_RGB_RGB_RGB_RGB_RGB_RGB_RGB_...

我想使用 OpenCV 访问这些数据,而不是制作新的副本。但是默认情况下会打包 CV_8UC3 类型的 OpenCV Mat,因此我使用显式步幅/步骤创建 Mat,使用

cv::Mat mat(
    2,
    sizes, // = (1080, 1920)
    CV_8UC3,
    reinterpret_cast<void*>(data),
    steps // = (7680, 4)
);

data 是指向rgb_color 数组的指针,由

定义
struct alignas(4) rgb_color  std::uint8_t r, g, b; ;

但是,将 matcv::VideoWriter 一起使用仍然会产生不正确的结果,而且 VideoWriter 似乎忽略了 Mat 的步幅。

这种类型的矩阵是否可以使用VideoWriter 和其他 OpenCV 功能?

【问题讨论】:

CV_8UC4(RGBA型号)合适吗? 否,因为应忽略填充字节(A 通道)。此外,代码是通用框架的一部分,因此它也应该适用于其他方面。 【参考方案1】:

VideoWriter 是异想天开的东西,所以如果它只是将数据复制为简单的 RGB,我不会感到惊讶。

来源摘录 - writeframe 的 FFMPEG 代理函数:

   return icvWriteFrame_FFMPEG_p(ffmpegWriter, (const uchar*)image->imageData,
        image->widthStep, image->width, image->height, image->nChannels, image->origin) !=0;

它使用行步填充 (widthStep),但忽略每个元素的填充。我认为一些类似的代码适用于其他 AVI 编写方法(vfw、dx、qt 等 - 懒得检查)。

请注意,每个元素的填充记录很少(刚刚在steps 描述中提到),所以我怀疑它的支持可能会在某些函数中被省略。

【讨论】:

没错。我将 OCV 中的 I/O 功能视为让一些原型快速运行的便利代码,而不是用于生产用途的东西。甚至 VideoWriter 的界面也只有一个目的——将一些常见的 Mat 格式写入文件。至少 CUDA 实现提供了回调以提供一定的灵活性。

以上是关于OpenCV 填充垫,与 VideoWriter 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV VideoWriter 帧率问题

OPENCV,无法打开类 VideoWriter

opencv-videowriter

使用opencv中的VideoWriter函数,保存视频

OpenCV VideoWriter 不写任何东西

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