Pointers 使用CvMat的Opencv中的指针算法?

Pointers 使用CvMat的Opencv中的指针算法?,pointers,opencv,matrix,Pointers,Opencv,Matrix,所以我试图通过指针访问矩阵元素。这是我的密码: CvMat *Q = cvCreateMat(3,3, CV_32F); for(int i = 0; i < Q->rows ; i++){ float *ptr = (float *)(Q->data.ptr + i * Q->step ); for(int j = 0; j < Q->cols ; j++){ *ptr = 0.0; if((i

所以我试图通过指针访问矩阵元素。这是我的密码:

    CvMat *Q = cvCreateMat(3,3, CV_32F);
    for(int i = 0; i < Q->rows ; i++){
    float *ptr = (float *)(Q->data.ptr + i * Q->step );
    for(int j = 0; j < Q->cols ; j++){
        *ptr = 0.0;
        if((i ==0)&&(j==0)) *ptr = 1;
        if((i ==0)&&(j==1)) *ptr = 2;
        if((i ==0)&&(j==2)) *ptr = 3;
        if((i ==1)&&(j==0)) *ptr = 4;
        if((i ==1)&&(j==1)) *ptr = 5;
        if((i ==1)&&(j==2)) *ptr = 6;
        if((i ==2)&&(j==0)) *ptr = 7;
        if((i ==2)&&(j==1)) *ptr = 8;
        if((i ==2)&&(j==2)) *ptr = 9;
        //cout << *ptr << endl;
        //system("pause");
    }
}
cout << CV_MAT_ELEM(*Q,float,0,0) << endl;
cout << CV_MAT_ELEM(*Q,float,0,1) << endl;
cout << CV_MAT_ELEM(*Q,float,0,2) << endl;
cout << CV_MAT_ELEM(*Q,float,1,0) << endl;
cout << CV_MAT_ELEM(*Q,float,1,1) << endl;
cout << CV_MAT_ELEM(*Q,float,1,2) << endl;
cout << CV_MAT_ELEM(*Q,float,2,0) << endl;
cout << CV_MAT_ELEM(*Q,float,2,1) << endl;
cout << CV_MAT_ELEM(*Q,float,2,2) << endl;
system("pause");
CvMat*Q=cvCreateMat(3,3,CV_32F);
对于(int i=0;irows;i++){
浮点*ptr=(浮点*)(Q->data.ptr+i*Q->step);
对于(int j=0;jcols;j++){
*ptr=0.0;
如果((i==0)和(&(j==0))*ptr=1;
如果((i==0)和(&(j==1))*ptr=2;
如果((i==0)和&(j==2))*ptr=3;
如果((i==1)和(&(j==0))*ptr=4;
如果((i==1)和&(j==1))*ptr=5;
如果((i==1)和&(j==2))*ptr=6;
如果((i==2)和&(j==0))*ptr=7;
如果((i==2)和&(j==1))*ptr=8;
如果((i==2)和&(j==2))*ptr=9;

//couth您应该在代码内部>代码> > <代码>循环> ./p> < p>检查API(如果您可以使用C++,也可以考虑使用垫子)。 我不完全确定您在这里想要完成什么,但是如果您想使用指针访问数据,那么此时您的操作有点错误

float *ptr = (float *)(Q->data.ptr + i * Q->step );
这里的步骤是一行中的字节数(因此这里是12,4字节/元素*3个元素)。当您使用指针进行算术运算时,指针将根据指针的数据类型自动步进正确的字节数(良好的教程)。为了像数组一样访问它,您应该这样做:

CvMat *Q = cvCreateMat(3,3, CV_32F);
for(int i = 0; i < Q->rows ; i++){
  for(int j = 0; j < Q->cols ; j++){
    float *ptr = (float *)(Q->data.ptr) + i*Q->rows + j; //Index is row major
    if((i ==0)&&(j==0)) *ptr = 1;
    if((i ==0)&&(j==1)) *ptr = 2;
    if((i ==0)&&(j==2)) *ptr = 3;
    if((i ==1)&&(j==0)) *ptr = 4;
    if((i ==1)&&(j==1)) *ptr = 5;
    if((i ==1)&&(j==2)) *ptr = 6;
    if((i ==2)&&(j==0)) *ptr = 7;
    if((i ==2)&&(j==1)) *ptr = 8;
    if((i ==2)&&(j==2)) *ptr = 9;
   }
}
CvMat*Q=cvCreateMat(3,3,CV_32F);
对于(int i=0;irows;i++){
对于(int j=0;jcols;j++){
float*ptr=(float*)(Q->data.ptr)+i*Q->rows+j;//索引是行主索引
如果((i==0)和(&(j==0))*ptr=1;
如果((i==0)和(&(j==1))*ptr=2;
如果((i==0)和&(j==2))*ptr=3;
如果((i==1)和(&(j==0))*ptr=4;
如果((i==1)和&(j==1))*ptr=5;
如果((i==1)和&(j==2))*ptr=6;
如果((i==2)和&(j==0))*ptr=7;
如果((i==2)和&(j==1))*ptr=8;
如果((i==2)和&(j==2))*ptr=9;
}
}
一个更简单的解决方案是使用现有的CV_MAT_ELEM宏

CvMat *Q = cvCreateMat(3,3, CV_32F);
for(int i = 0; i < Q->rows ; i++){
  for(int j = 0; j < Q->cols ; j++){
    CV_MAT_ELEM(*Q, float, i, j) = i*Q->rows + j + 1;
   }
}
CvMat*Q=cvCreateMat(3,3,CV_32F);
对于(int i=0;irows;i++){
对于(int j=0;jcols;j++){
CV_MAT_ELEM(*Q,float,i,j)=i*Q->行+j+1;
}
}

在定义ptr的那一行,如何将浮点指针(float)(Q->data.ptr)添加到非指针i*Q->rows+j?Q->data.ptr到底指向什么?行的第一个元素?CvMat中的数据存储为数组,Q->data.ptr是指向该数组开头的指针。在那一行,我添加(i*Q->rows+j)到指针的开头,这会将指针沿多个点的数组移动。阅读指针算术将帮助您理解: