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; };
然而,将此 mat
与 cv::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
描述中提到),因此我怀疑某些函数可能会省略它的支持。
我有一个使用 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 功能?
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
描述中提到),因此我怀疑某些函数可能会省略它的支持。