我接手了一个程序,它使用一维数组来构造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发布于 2022-04-13 03:45:46
用于cv::Mat ()的构造函数中的第三个参数指定了数据缓冲区的格式。
您的数据是一个short数组,即每个条目是2个字节。当您像以前一样使用值小的值时,这意味着每个短值的一个字节将为0。
当您使用此缓冲区初始化类型为cv::Mat的CV_8U时,您会告诉opencv将该缓冲区视为包含无符号字符(1字节元素)。因此,每个short被解释为2个unsigned char字节。
,这就是为什么在输出中获得零的原因。
每个人都将数据缓冲区的类型更改为unsigned char [],或者将cv::Mat数据类型更改为CV_16S。这两个应该是匹配的。
你可以这样做,例如:
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
https://stackoverflow.com/questions/71851305
复制相似问题