从 3d 数组创建 cv::Mat 图像

Posted

技术标签:

【中文标题】从 3d 数组创建 cv::Mat 图像【英文标题】:Creating a cv::Mat image from a 3d array 【发布时间】:2020-12-20 14:44:41 【问题描述】:

假设我有一个数组

uint8_t img[1000][1200][3]

其中前 2 个维度表示图像的大小(高度、宽度), 第三个是频道(BGR)。 例如

img[200][100][1]

给出坐标为 (200, 100) 的绿色像素的值。

如何将此数组转换为 cv::Mat 图像? 我试过了

cv::Mat my_image(1000, 1200, CV_8UC3, img);

但我不确定我得到的结果是否正确。有什么提示吗?

【问题讨论】:

你知道img的内容吗?为什么不直接使用imshow 看看结果呢? 您尝试的内容基本上是正确的(CV_8UC3 之前的逗号!),但可能需要强制转换,如果编译器抱怨。为什么你怀疑结果的正确性?最多颜色通道是错误的,你可以用 cvtColor 修复。 OpenCV 需要 BGR 顺序,而不是 RGB 顺序。 【参考方案1】:

不是 cpp 方面的专家,但想法如下:

uint8_t img[1000][1200][3];
uint8_t *p = img;
//Consturctor takes a pointer to image data, possibly you will need to swap height and width. 
cv::Mat my_image(1000, 1200 CV_8UC3, (void*)p);

【讨论】:

该解决方案在功能上与问题代码相同,除了强制转换。

以上是关于从 3d 数组创建 cv::Mat 图像的主要内容,如果未能解决你的问题,请参考以下文章

如何使用模板函数从缓冲区(T* 数据数组)创建 cv::Mat?

如何将从 C++ 发送的 cv::MAT 字节数组转换为 Java 中的位图?

来自表示 RGB 图像的浮点数组的初始 CV::MAT

OpenCV 使用 stride 从数组生成 cv::Mat

我无法将cv :: Mat保存到1D数组中

如何从函数返回多维 Mat 数组