矩阵类型和内存寻址

     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*该类型数据所占的字节数。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值