矩阵类型和内存寻址
来源:互联网 发布: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*该类型数据所占的字节数。
- 矩阵类型和内存寻址
- Linux内存寻址和内存管理
- Linux内存寻址和内存管理
- Linux内存寻址和内存管理
- 内存编址,寻址和内存对齐
- 内存寻址
- 内存寻址
- 内存寻址
- 内存寻址
- 内存寻址
- 内存寻址
- 内存寻址
- 内存寻址
- 内存寻址
- 内存寻址
- 关于内存管理和寻址、地址空间
- Linux内存寻址和内存管理(x86 IA-32架构)
- Linux内存寻址和内存管理(转载)
- NAND和NOR flash的区别(转载)
- 在Apache下配置PHP5
- H323笔记
- Oracle 数据库管理脚本 命名规范
- 平面设计LOGO输出十大陷阱
- 矩阵类型和内存寻址
- 一个最简单的测试在dev/下生成字符设备的程序
- 我来写一个Vim的使用心得吧(1)
- C#中ASCLL码转int类型解决方法
- linux内核模块传参
- Oracle Compile 编译 无效对象
- 几种坐标系
- 程序员面试题精选100题(06)-判断整数序列是不是二元查找树的后序遍历结果
- 误人子弟之“too many open files”