Pointers OpenCV使用数据填充CvMat并对其进行验证

Pointers OpenCV使用数据填充CvMat并对其进行验证,pointers,opencv,Pointers,Opencv,下面我有一个训练集结构向量,叫做数据 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[

下面我有一个训练集结构向量,叫做数据

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是检查矩阵内容是否是我刚刚输入的数据,但它们不匹配。这些矩阵似乎有完全不同的数据

有什么想法吗?

在我看来,输入和输出不是一个连续的数组,而是一个指针数组

我认为cvMat需要一个连续的内存阵列才能对其进行操作

此外,创建阵列后,不需要从中创建CvMat,只需 使用


首先我应该声明我不经常使用C++,我不是很好。也就是说,我不知道如何为这些数据创建一个连续数组。由于训练集中数据文件的长度是可变的,所以训练集中的数据也是可变的。另外,神经网络的训练功能需要输入和输出集的矩阵来训练,你能给我一个使用CvSetData训练神经网络的例子吗?我发现我可以用以下方法来实例化我的矩阵:CvMat TRAINPUT=cvMatdatasize,2*时间步长,CV_32S,in;CvMat trainOutput=cvMatdatasize,3*NUM_跟踪点,CV_32FC1,输出;但这会导致一个奇怪的问题,它根本无法运行程序。它可以编译,但当我运行它时,它会在它到达我的程序之前给我一个异常,在内核的某个地方。
CvSetData( header, data ).