OpenCV 填充垫,与 VideoWriter 一起使用

OpenCV padded Mat, use with VideoWriter

我有一个使用 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 默认情况下是打包的,所以我使用

显式 strides/steps 创建 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 功能?

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 描述中提到),因此我怀疑某些函数可能会省略它的支持。