因此,我试图通过指针访问矩阵元素。这是我的代码:
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来自哪里?我在这里不明白什么?我对指针有点陌生。
最佳答案
checkout 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;
}
}
关于pointers - 使用CvMat的Opencv中的指针算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19944269/