将CV_16SC2 Mat保存到文件OpenCV

时间:2011-09-13 09:06:48

标签: opencv

我想将CV_16SC2矩阵保存到文件中。它是initUndistortRectifyMap的结果。我需要它以二进制形式,后来我想从文件中读取它。什么是最好的方法(YAML,因为所需的空间,XML很糟糕)?

1 个答案:

答案 0 :(得分:5)

如果您不想使用提供的方式XML/YMAL Input and Output。你必须自己写。

首先确保您拥有正确的类型。使用cout << mat.type()并查看下表。

        C1  C2  C3  C4
CV_8U   0   8   16  24
CV_8S   1   9   17  25
CV_16U  2   10  18  26
CV_16S  3   11  19  27
CV_32S  4   12  20  28
CV_32F  5   13  21  29
CV_64F  6   14  22  30

现在您知道Matrixelements的频道数和正确类型(bitcount)。 例如,数字mat.type() == 11表示您的类型为:CV_16SC2,所以16位(签名为短)和2通道。

如果你现在没有bitcount和variablename之间的关系,请检查以下内容:

Unsigned 8bits uchar 0~255
Mat: CV_8UC1, CV_8UC2, CV_8UC3, CV_8UC4

Signed 8bits char -128~127
Mat: CV_8SC1,CV_8SC2,CV_8SC3,CV_8SC4

Unsigned 16bits ushort 0~65535
Mat: CV_16UC1,CV_16UC2,CV_16UC3,CV_16UC4

Signed 16bits short -32768~32767
Mat: CV_16SC1,CV_16SC2,CV_16SC3,CV_16SC4

Signed 32bits int -2147483648~2147483647
Mat: CV_32SC1,CV_32SC2,CV_32SC3,CV_32SC4

Float 32bits float -1.18*10-38~3.40*10-38 
Mat: CV_32FC1,CV_32FC2,CV_32FC3,CV_32FC4

Double 64bits double 
Mat: CV_64FC1,CV_64FC2,CV_64FC3,CV_64FC4

要访问它们,您需要将at与正确的type一起使用!

在我们的CV_16SC2(签名短信和双信道)示例中,这意味着:Vec2s

Vec因为我们需要一个向量2,因为有2个频道s,因为我们需要一个有符号的短片。

所以要将位置(5,7)的第二个通道的值变为变量's',你可以写:

Vec2s v = mat.at<Vec2s>(5, 7);
short s = v[1];

由于你想要保存你的矩阵,你可能想要先写下矩阵的大小(行,列,通道),然后再写下所有值。

感谢http://ninghang.blogspot.de/2012/11/list-of-mat-type-in-opencv.html向我提供了最终了解所有内容的信息!