2011-04-10 58 views
0

我有TrainingSets的向量(結構如下圖)稱爲數據OpenCV的填充數據與CvMat和驗證它

class TrainingSet 
{ 
public: 
int time; 
float input[2]; 
float output[3*NUM_TRACKING_POINTS]; 

TrainingSet(int t, float in[2], float out[3*NUM_TRACKING_POINTS]) 
{ 
    time = t; 
    for (int i = 0; i < 2; i++) 
     input[i] = in[i]; 
    for (int i = 0; i < 3*NUM_TRACKING_POINTS; i++) 
     output[i] = out[i]; 
} 
TrainingSet() 
{ 

} 
}; 

然後我嘗試採用這種矢量的內容,並把它們納入CvMats爲目的培訓一個神經網絡。

int datasize = data.size(); 
float** in = new float*[datasize]; 
float** out = new float*[datasize]; 

for (int i = 0; i < datasize; i++) { 
    in[i] = new float[2*TIME_STEPS]; 
    out[i] = new float[3*NUM_TRACKING_POINTS]; 
} 

for (int i = 0 ; i < datasize; i ++) 
{ 
    // get the first set in the sequence. 
    TrainingSet tset = data.front(); 
    data.pop(); 

    // get the inputs 
    in[i] = new float[2*TIME_STEPS]; 
    in[i][0] = tset.input[0]; 
    in[i][1] = tset.input[1]; 

    // get the outputs 
    out[i] = new float[3*NUM_TRACKING_POINTS]; 
    for (int j = 0; j < 3*NUM_TRACKING_POINTS; j++) 
     out[i][j] = tset.output[j]; 

    for (int j = 2; j < 2*TIME_STEPS; j++) 
    { 
     if (i == 0) 
      in[i][j] = 0.0f; 
     else 
      in[i][j] = in[i - 1][j - 2]; 
    } 
} 

// make matrices from data. 
CvMat *trainInput = cvCreateMat(datasize, 2*TIME_STEPS, CV_32FC1); 
cvInitMatHeader(trainInput, datasize, 2*TIME_STEPS, CV_32FC1, in); 
CvMat *trainOutput = cvCreateMat(datasize, 3*NUM_TRACKING_POINTS, CV_32FC1); 
cvInitMatHeader(trainOutput, datasize, 3*NUM_TRACKING_POINTS, CV_32FC1, out); 

for (int x = 0; x < datasize; x++) 
{ 
    cout << "IN: "; 
    for (int y = 0; y < 2*TIME_STEPS; y++) 
     cout << cvmGet(trainInput, x, y) << " "; 
    cout << endl << "IN: "; 
    for (int y = 0; y < 2*TIME_STEPS; y++) 
     cout << in[x][y] << " "; 
    cout << endl << "OUT: "; 
    for (int y = 0; y < 3 * NUM_TRACKING_POINTS; y++) 
     cout << cvmGet(trainOutput, x, y) << " "; 
    cout << endl << "OUT: "; 
    for (int y = 0; y < 3 * NUM_TRACKING_POINTS; y++) 
     cout << out[x][y] << " "; 
    cout << endl << endl; 
} 

最後一個forloop是檢查矩陣內容是否是我剛剛提供的數據,但它們不匹配。矩陣似乎有完全不同的數據。

有什麼想法會出錯?

回答

0

對我來說似乎是inout不是連續的數組,而是一個指針數組。

我認爲cvMat需要一個連續的存儲器陣列才能對其進行操作。

而且一旦你創建數組,你並不需要創建一個它CvMat中,只是 使用

CvSetData(header, data). 
+0

首先,我要聲明我不使用C++很多時候,我不是很好。也就是說,我不知道如何爲這個數據創建一個連續的數組。由於訓練集中數據文件的長度是可變的,訓練集中的數據也是可變的。此外,神經網絡的train()函數需要用於輸入和輸出集的矩陣訓練,您能給我一個使用CvSetData()來訓練神經網絡的例子嗎? – acp10bda 2011-04-10 18:28:03

+0

我發現我可以實例化我的矩陣: \t CvMat trainInput = cvMat(datasize,2 * TIME_STEPS,CV_32S,in); \t CvMat trainOutput = cvMat(datasize,3 * NUM_TRACKING_POINTS,CV_32FC1,out); 但是這會導致一個奇怪的問題,它根本無法運行程序。它編譯,但是當我運行它時,它甚至在它到達我的程序之前,在內核中的某處發生異常。 – acp10bda 2011-04-12 11:19:36