通过C++一维数组构造cv::Mat
Construct cv::Mat via C++ 1D array
我接手了一个程序,用一维数组构造cv::Mat。我对此感到困惑,我做了一个演示:
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;
}
我希望输出是
11 12 13 14
21 22 23 24
31 32 33 34
43 42 43 44
但是我在 MATLAB 中打开 img:
11 0 12 0
13 0 14 0
21 0 22 0
23 0 24 0
您用于 cv::Mat (CV_8U
) 的构造函数中的第三个参数指定数据缓冲区的格式。
您的数据是 short
的数组,即每个条目为 2 个字节。当您像您一样使用值较小的值时,这意味着每个短的字节之一将为 0。
当您使用此缓冲区初始化类型为 CV_8U
的 cv::Mat 时,您告诉 opencv 将缓冲区视为包含无符号字符(1 字节元素)。所以每个 short
被解释为 2 unsigned char
字节。
这就是您在输出中得到零的原因。
要么将数据缓冲区的类型更改为 unsigned char []
,要么将 cv::Mat 数据类型更改为例如CV_16S
。 2 通常应该匹配。
你可以做到,例如像这样:
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
我接手了一个程序,用一维数组构造cv::Mat。我对此感到困惑,我做了一个演示:
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;
}
我希望输出是
11 12 13 14
21 22 23 24
31 32 33 34
43 42 43 44
但是我在 MATLAB 中打开 img:
11 0 12 0
13 0 14 0
21 0 22 0
23 0 24 0
您用于 cv::Mat (CV_8U
) 的构造函数中的第三个参数指定数据缓冲区的格式。
您的数据是 short
的数组,即每个条目为 2 个字节。当您像您一样使用值较小的值时,这意味着每个短的字节之一将为 0。
当您使用此缓冲区初始化类型为 CV_8U
的 cv::Mat 时,您告诉 opencv 将缓冲区视为包含无符号字符(1 字节元素)。所以每个 short
被解释为 2 unsigned char
字节。
这就是您在输出中得到零的原因。
要么将数据缓冲区的类型更改为 unsigned char []
,要么将 cv::Mat 数据类型更改为例如CV_16S
。 2 通常应该匹配。
你可以做到,例如像这样:
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