OpenCV заполняет CvMat данными и проверяет их - PullRequest
0 голосов
/ 10 апреля 2011

У меня есть вектор обучающих наборов (структура ниже), называемый данными

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 должен проверить, является ли содержимое матриц данными, которые я только что предоставил, но они не совпадают. Матрицы, кажется, имеют совершенно разные данные.

Есть мысли о том, что идет не так?

1 Ответ

0 голосов
/ 10 апреля 2011

Мне кажется, что in и out - это не непрерывный массив , а массив указателей.

Я думаю, что для работы cvMat необходим непрерывный массив памяти.

Кроме того, после создания массива вам не нужно создавать CvMat, просто использовать

CvSetData( header, data ).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...