尝试在OpenCV中设置矩阵值时发生指针错误

Pointer error when trying to set the value of a matrix in OpenCV

本文关键字:错误 指针 OpenCV 设置      更新时间:2023-10-16

我的代码有问题。下面提到了我的代码片段

这些是我读取的一些样本值

116 117 77 0.170833333333333 0.341880341880342 
FILE* fid= fopen("treewall","r");
            while (fscanf(fid,"%f",&a)==1)
            {
                    printf("%fn",a);
                    trainsamplecount=trainsamplecount+1;
            }
            cout<<trainsamplecount<<endl;
            rewind(fid);
            float td[2000][7];
            int numoftestpoints;
            CvMat* traindata=cvCreateMat(trainsamplecount,6,CV_32FC1);
            CvMat* trainclasses=cvCreateMat(trainsamplecount,1,CV_32FC1);
            CvMat* samplewts=cvCreateMat(trainsamplecount,1,CV_32FC1);
            CvMat* neurallayers=cvCreateMat(4,1,CV_32SC1);
            CvMat traindata1,trainclasses1,neurallayers1,samplewts1;
            cvGetRows(traindata,&traindata1,0,trainsamplecount);
            cvGetRows(trainclasses,&trainclasses1,0,trainsamplecount);
            cvGetRows(samplewts,&samplewts1,0,trainsamplecount);
            cvGetRows(neurallayers,&neurallayers1,0,4);
            cvSet1D(&neurallayers1, 0, cvScalar(6));
            cvSet1D(&neurallayers1,1,cvScalar(3));
            cvSet1D(&neurallayers1,2,cvScalar(3));
            cvSet1D(&neurallayers1, 3, cvScalar(1));
            int i=0,j=0;
            if(fid)
            {
            for(int i=0;i<trainsamplecount;i++)
                fscanf(fid,"%f %f %f %f %f %f %f ",&td[i][0],&td[i][1],&td[i][2],&td[i][3],&td[i][4],&td[i][5],&td[i][6]);

            for (i=0;i<trainsamplecount;i++)
            {
                cout<<i<<endl;
                cvSetReal2D(traindata,i,0,(float)td[i][0]);
                cvSetReal2D(traindata,i,1,(float)td[i][1]);
                cvSetReal2D(traindata,i,2,(float)td[i][2]);
                cvSetReal2D(traindata,i,3,(float)td[i][3]);
                cvSetReal2D(traindata,i,4,(float)td[i][4]);
                cvSetReal2D(traindata,i,5,(float)td[i][5]);
                cvSet1D(&trainclasses1,i,cvRealScalar(1));
                cvSet1D(&samplewts1,i,cvRealScalar(1));
            }
            }

它在cvSetReal2D中给出一个错误。这会产生以下错误:

OpenCV Error: Bad argument (unrecognized or unsupported array type) in cvPtr2D, file /usr/local/src/OpenCV-2.3.0/modules/core/src/array.cpp, line 1830
terminate called after throwing an instance of 'cv::Exception'

我在Ubuntu中使用OpenCV中的eclipse。请帮我解决这个问题。

下面是您尝试做什么的简化示例。这在我使用OpenCV 2.3.1:的机器上正确工作

#define SAMPLE_COUNT 5
int main(int argc, char** argv)
{
    CvMat* data = cvCreateMat(SAMPLE_COUNT, 6, CV_32FC1);
    for (int i = 0; i < SAMPLE_COUNT; i++)
    {
        cout << "Adding i = " << i << endl;
        cvSetReal2D(data, i, 0, (float)i);
        cvSetReal2D(data, i, 1, (float)i);
        cvSetReal2D(data, i, 2, (float)i);
        cvSetReal2D(data, i, 3, (float)i);
        cvSetReal2D(data, i, 4, (float)i);
        cvSetReal2D(data, i, 5, (float)i);
    }

    return 0;
}

然而,我不确定你想用这些线路实现什么:

cvGetRows(data, &data1, 0, samplecount);
cvGetRows(classes, &classes1, 0, samplecount);

你正在把整个矩阵作为一个子矩阵,所以data1等价于data;同样地,classes1等价于classes。那么,为什么不直接使用dataclasses指针呢?

需要更多的信息来完全解决你的问题,我认为。。。