我有一个使用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; };
但是,将此mat
与cv::VideoWriter
一起使用仍然会产生错误的结果,VideoWriter
似乎忽略了Mat
的步伐。
是否可以将VideoWriter
和其他OpenCV功能与此类型的矩阵一起使用?
答案 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
描述中提到),因此我怀疑在某些函数中可能会省略它的支持。