我需要读取matlab生成的txt,里面存放着3*3的矩阵,我在尝试用opencv读取txt 并转存为yaml文件时出现了问题。
原始数据
3.2212523e-01 -3.2059794e-02 -7.1996807e-05
9.0743866e-02 4.9048730e-01 8.8287459e-05
4.8554884e+02 2.2995003e+02 1.0000000e+00
原始opencv 代码
ifstream infile;
infile.open(strtemp); //打开原始txt路径
float data[3][3]; //存放读取的3*3矩阵
for (int k = 0; k<3; k++)
{
for (int h = 0; h<3; h++)
{
infile >> data[k][h];
}
}
Mat datatemp;//转换为Mat
datatemp = Mat(3, 3, CV_32FC1, data);//数组内容写入Mat
string str1 = ".\\data\\matrix\\c2proMatrix-";
string strtemp1 = str1 + to_string(i) + "-" + to_string(j) + ".txt";
FileStorage wstemp(strtemp1, FileStorage::WRITE);
wstemp << "c2proMatrix" << datatemp;//Mat内容写入ymal,只是以txt文件结尾
wstemp.release();
得到了如下txt
%YAML:1.0
---
c2proMatrix: !!opencv-matrix
rows: 3
cols: 3
dt: f
data: [ 3.22125226e-01, -3.20597924e-02, -7.19968084e-05,
9.07438695e-02, 4.90487307e-01, 8.82874592e-05, 4.85548828e+02,
2.29950027e+02, 1. ]
其中data与原始文件一样,但是随后我将
datatemp = Mat(3, 3, CV_32FC1, data);//数组内容写入Mat
替换为64位浮点数存储时
datatemp = Mat(3, 3, CV_64FC1, data);//数组内容写入Mat
存储下来的文件为
%YAML:1.0
---
c2proMatrix: !!opencv-matrix
rows: 3
cols: 3
dt: d
data: [ -8.5784328635828890e-15, 2.3504486149820950e-11,
1.8922431301030191e-35, 4.9427076877791744e+16,
-9.2559604281615349e+61, -9.2559631349317831e+61,
-9.2559631349317831e+61, 8.0635840052727823e-314,
-9.2559631349317831e+61 ]
对比data,与原始数据产生了较大差距,查了很多资料才明白,32F为32位数据,数据必须以指向32位数据类型的指针存取,在32位编译器上是32位单精度浮点数,那么后面对该矩阵的输入输出的数据指针类型都应该是float;而64F是64位数据,必须以指向64位数据类型的指针存取,在32位编译器上是64位双精度浮点数,对应为double类型,否则会报错。
所以之前如果用float类型的数组,若后面使用64F读数据,必然会报错。
float data[3][3]; //存放读取的3*3矩阵
故应该改为
double data[3][3]; //存放读取的3*3矩阵
在使用CV_64F读取就不会出错了。
来源:CSDN
作者:jngwe
链接:https://blog.csdn.net/jngwe/article/details/104812274