OpenCV填充垫,与VideoWriter一起使用

时间:2016-04-28 07:41:15

标签: c++ opencv image-processing opencv3.0

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

因此数组的格式为

RGB_RGB_RGB_RGB_RGB_RGB_RGB_RGB_RGB_RGB_RGB_RGB_RGB_RGB_RGB_...

我想使用OpenCV访问此数据,而不是制作新的副本。但是默认情况下打包类型为Mat的OpenCV CV_8UC3,因此我使用

创建具有显式步幅/步骤的Mat
cv::Mat mat(
    2,
    sizes, // = (1080, 1920)
    CV_8UC3,
    reinterpret_cast<void*>(data),
    steps // = (7680, 4)
);

data是指向由{/ p>定义的rgb_color数组的指针

struct alignas(4) rgb_color { std::uint8_t r, g, b; };

但是,将此matcv::VideoWriter一起使用仍然会产生错误的结果,VideoWriter似乎忽略了Mat的步伐。

是否可以将VideoWriter和其他OpenCV功能与此类型的矩阵一起使用?

1 个答案:

答案 0 :(得分:3)

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