2012-07-24 1292 views
2

我试图将数据文件(1000 x 5双)读入Mat对象。 Mat对象初始化为Mat :: zeros(1000,5,CV_32F)。在读取每行数据时,将相应的行分配给新值。代码如下所示:C + + opencv同时为Mat(矩阵)元素赋值,先前赋值的元素已更改

void readNavFile(const char* filename, Mat& navdata) { 

    ifstream infile(filename); 
    string line; 
    int x=0, y=0; 

    if (infile.is_open()) { 

     while (getline(infile, line)) { 
      double value; 
      stringstream converter(&line[0]); 
      double* p = navdata.ptr<double>(x); 
      while (converter >> value) { 

       p[y++] = value; 
       //DEBUGING 
       cout << "Pointer value:" << p[y-1] << endl; 
       cout << "Matrix value at:" << "row:" << x << " col:" << y-1 <<" is: "<< navdata.at<double>(x,y-1)<< endl; 
       cout << navdata.at<double>(0,4) << endl; 

      } 
      y = 0; 
      x++; 
     } 

     infile.close(); 
     //DEBUGING 
     cout << "Final matrix first row, last element:" << navdata.at<double>(0,4) << endl; 
    } 
} 

正如你所看到的,我试着打印出垫(矩阵)元素的值,因为它们进行分配,这样我可以肯定的是正确的值存储。奇怪的是,这项任务都进行得很顺利,但是之前分配的一些元素会让所有突变者改变它们的价值。样品的输出看起来象以下,在最后一行,分配元件[1,2],在[0,4]从它的正确值18.1901改为3.31757e-190后的值:

Pointer value:-35.1236 
Matrix value at:row:0 col:0 is: -35.1236 
Matrix element [0,4]: 0 
Pointer value:150.735 
Matrix value at:row:0 col:1 is: 150.735 
Matrix element [0,4]: 0 
Pointer value:360.094 
Matrix value at:row:0 col:2 is: 360.094 
Matrix element [0,4]: 0 
Pointer value:3.46045 
Matrix value at:row:0 col:3 is: 3.46045 
Matrix element [0,4]: 0 
Pointer value:18.1901 
Matrix value at:row:0 col:4 is: 18.1901 
Matrix element [0,4]: 18.1901 
Pointer value:-35.1236 
Matrix value at:row:1 col:0 is: -35.1236 
Matrix element [0,4]: 18.1901 
Pointer value:150.735 
Matrix value at:row:1 col:1 is: 150.735 
Matrix element [0,4]: 18.1901 
Pointer value:360.096 
Matrix value at:row:1 col:2 is: 360.096 
Matrix element [0,4]: 3.31757e-190 

莫非有人帮我弄清楚发生了什么事?非常感谢你!

+2

一个疯狂的猜测,因为我不知道库,但'CV_32F'碰巧意味着“32位浮点”?而'double'碰巧有64位? – 2012-07-24 01:22:53

+0

是的,就是这样。我最初有浮动,然后我想我可能需要额外的精度,所以改变了一倍,但忘了改变mat init!谢谢! – Silmarilli 2012-07-24 01:35:57

回答

1

32F代表OpenCV中的浮点数。 navdata.at<double>(0,4)不正确。您应该使用navdata.at<float>(0,4)或者将您的数据类型更改为64F。另外,OpenCV应该为你的代码抛出一个异常。你确定它没有?