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; ;
但是,将 mat
与 cv::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 一起使用的主要内容,如果未能解决你的问题,请参考以下文章