首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过C++一维阵列构造cv::Mat

通过C++一维阵列构造cv::Mat
EN

Stack Overflow用户
提问于 2022-04-13 02:52:38
回答 1查看 88关注 0票数 1

我接手了一个程序,它使用一维数组来构造cv::Mat。我对此感到困惑,我做了一个演示:

代码语言:javascript
复制
int main()
{
    short data[] = {
        11, 12, 13, 14,
        21, 22, 23, 24,
        31, 32, 33, 34,
        43, 42, 43, 44
    };

    cv::Mat m{ 4, 4, CV_8U, data};

    cv::imwrite("test.png", m);

    return 0;
}

我希望输出是

代码语言:javascript
复制
11 12 13 14
21 22 23 24
31 32 33 34
43 42 43 44

但是我在MATLAB中打开了img:

代码语言:javascript
复制
11  0   12  0
13  0   14  0
21  0   22  0
23  0   24  0
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-13 03:45:46

用于cv::Mat ()的构造函数中的第三个参数指定了数据缓冲区的格式

您的数据是一个short数组,即每个条目是2个字节。当您像以前一样使用值小的值时,这意味着每个短值的一个字节将为0。

当您使用此缓冲区初始化类型为cv::MatCV_8U时,您会告诉opencv将该缓冲区视为包含无符号字符(1字节元素)。因此,每个short被解释为2个unsigned char字节。

,这就是为什么在输出中获得零的原因。

每个人都将数据缓冲区的类型更改为unsigned char [],或者将cv::Mat数据类型更改为CV_16S。这两个应该是匹配的。

你可以这样做,例如:

代码语言:javascript
复制
unsigned char data[] = {
    11, 12, 13, 14,
    21, 22, 23, 24,
    31, 32, 33, 34,
    43, 42, 43, 44
};

cv::Mat m{ 4, 4, CV_8U, data };

您可以在这里看到opencv数据类型的列表(在数据类型部分):

https://docs.opencv.org/3.4/d1/d1b/group__core__hal__interface.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71851305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档