我想将CV_16SC2矩阵保存到文件中.它是initUndistortRectifyMap的结果.我需要它以二进制形式,后来我想从文件中读取它.最好的方法是什么(YAML,因为所需的空间,XML很糟糕)?
如果您不想使用提供的XML/YMAL输入和输出方式.你必须自己写.
首先确保您的类型正确.使用 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
Run Code Online (Sandbox Code Playgroud)
现在您知道了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
Run Code Online (Sandbox Code Playgroud)
在我们的CV_16SC2(签名的短信和2信道)示例中,这意味着:Vec2s
.
Vec
因为我们想要一个矢量,2
因为有2个通道s
,因为我们想要一个带符号的短路.
因此,要将位置(5,7)的第二个通道的值转换为变量's',您可以写:
Vec2s v = mat.at<Vec2s>(5, 7);
short s = v[1];
Run Code Online (Sandbox Code Playgroud)
由于您要保存Matrix,您可能希望首先写入矩阵的大小(行,列,通道)以及之后的所有值.
感谢http://ninghang.blogspot.de/2012/11/list-of-mat-type-in-opencv.html为我提供最终了解一切的信息!