OpenCV填充垫,与VideoWriter一起使用

OpenCV padded Mat, use with VideoWriter

本文关键字:一起 VideoWriter 填充 OpenCV      更新时间:2023-10-16

我有一个使用 3 字节颜色值的 2D 数组表示的图像(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功能用于这种类型的矩阵?

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

摘自来源 - FFMPEG 代理函数writeframe

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