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

时间:2013-11-13 02:45:25

标签: 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 ==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");

我试图将for循环中的矩阵设为:

[1 2 3

4 5 6

7 8 9],

但是当他们开玩笑的时候,我得到了:

3

-4.31602e + 008

-4.31602e + 008

6

-4.31602e + 008

-4.31602e + 008

9

-4.31602e + 008

-4.31602e + 008

-4.31602e + 008来自哪里?我在这里不理解什么?我对指针有点新意。

2 个答案:

答案 0 :(得分:2)

查看CvMat的API(如果可以使用c ++,也可以考虑使用Mat。)

我不完全确定你要在这里完成什么,但是如果你想使用指针访问数据,那么你现在做的有点错误。

float *ptr = (float *)(Q->data.ptr + i * Q->step );

这里的步骤是一行中的字节数(所以这里它将是12个,每个元素4个字节* 3个元素)指针将根据指针的数据类型自动步进正确的字节数用它算术(好教程here)。为了像数组一样访问它,你应该这样做:

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

更简单的解决方案是使用存在的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;
   }
}

答案 1 :(得分:0)

您应该在内部ptr循环内增加j