OpenCV填充垫,与VideoWriter一起使用
OpenCV padded Mat, use with VideoWriter
我有一个使用 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; };
但是,将此mat
与cv::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
描述中提到),因此我怀疑在某些函数中可能会省略它的支持。
相关文章:
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将C++中的库和头与MinGW一起使用
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 将fold表达式与std::一起用于两个元组
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 将 std::allocate_shared 与多态资源分配器一起使用
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 将 exprtk 与自定义类的对象一起使用
- 将 std::set 与基于键的比较器一起使用
- 将 C++ 类与 Rcpp 一起使用,从 C 或 R 修改它
- 如何将 Eigen::Ref 与 pybind11 一起使用?
- 如何将AERT_Allocate与 std:vector 一起使用
- 如何使我的 sizeof sum 结构与空参数包一起工作
- OpenCV填充垫,与VideoWriter一起使用