opencv 中CV_32F和CV_64读取数据结果不一致

有些话、适合烂在心里 提交于 2020-03-12 12:59:08

我需要读取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读取就不会出错了。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!