矩阵类型和内存寻址

来源:互联网 发布:vivo网络销售授权 编辑:程序博客网 时间:2024/06/10 11:11
     Opencv中矩阵的类型根据数据类型的不同可以大体分为CV_8U,CV_8S,CV_16U,CV_8S,CV_32F,CV_64F(通道数不予理会)。8位显然对应char,16位对应short,32位对应init和float,64位对应double型数据。通过分析CvMat中data数据可以发现,data是个联合数据类型,包括了uchar* ptr, short* s, int* i, float* fl, double* db,通过断点调试可以知道,这些指针类型虽然不同,但是值都是一样的,即指向了存储数据的开头。

    虽然从程序员的角度来讲,数据有不同的类型,但是计算机的理解就是一堆以字节为单位的连续存储空间,因此CvMat中的step值是矩阵中一行的字节数,即每一行的元素个数*一个元素所占的字节数。我们在使用指针进行寻址的时候,可以先得到每一行的起始地址,如下代码所示:

CvMat* samples = cvCreateMat(nSample, dims, CV_32FC1);float* _samples = samples->data.fl + (i-1)*samples->step;    因为矩阵是float型的数据,我们可能取每行首地址的时候,选择使用data.fl,但是这里的step就使用错误了,因为step表示的是字节数目,而不是float型数据的个数,显然这里要么:
CvMat* samples = cvCreateMat(nSample, dims, CV_32FC1);float* _samples = samples->data.fl + (i-1)*samples->step/sizeof(float);
要么:
CvMat* samples = cvCreateMat(nSample, dims, CV_32FC1);float* _samples = (float*)(samples->data.ptr + (i-1)*samples->step);

    总而言之,指针的索引寻址是类型敏感的,ptr+i,这个i 跨越的长度是i*该类型数据所占的字节数。

原创粉丝点击