2012-07-24 83 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應該爲你的代碼拋出一個異常。你確定它沒有?