2011-04-10 3 views
0

을 검증 나는 (구조체 아래)라는 데이터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에 넣어하려고 TrainingSets의 벡터를 신경망 훈련

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; 
} 

마지막 for 루프는 매트릭스 콘텐츠가 방금 입력 한 데이터인지 확인하지만 일치하지 않습니다. 매트릭스는 완전히 다른 데이터를 가진 것처럼 보입니다.

어떤 문제가 발생했는지에 대한 의견이 있으십니까?

답변

0

inout은 연속적인 배열이 아니라 포인터 배열입니다.

나는 cvMat가 동작 할 수 있도록 인접한 메모리 배열을 필요로한다고 생각한다. 또한

당신이 배열을 생성하면, 당신은 단지 가

CvSetData(header, data). 
+0

우선 사용, 그것에서 CvMat를 만들 필요가 없습니다 내가 자주, 내가 매우 아니에요 C++를 사용하지 않는 명시해야 좋은. 즉,이 데이터에 대해 연속 배열을 만드는 방법을 알지 못합니다. 트레이닝 세트의 데이터 파일 길이가 가변적이므로 트레이닝 세트의 데이터도 가변적입니다. 또한 신경망의 train() 함수는 입력 및 출력 세트에 대한 행렬을 사용하여 학습해야합니다. CvSetData()를 사용하여 신경 네트워크를 학습하는 예를 들어 주시겠습니까? – acp10bda

+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