从 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 中的位图?