专栏中心

EEPW首页 > 专栏 > 共用体与OPENCV里面矩阵的定义

共用体与OPENCV里面矩阵的定义

发布人:0750long 时间:2009-06-08 来源:工程师 发布文章
共用体与OPENCV里面矩阵的定义

opencv里面关于CVMAT类型的定义:
typedef struct CvMat
{
    int type;
    int step;

    /* for internal use only */
    int* refcount;
    int hdr_refcount;

    union
    {
        uchar* ptr;
        short* s;
        int* i;
        float* fl;
        double* db;
    } data;

#ifdef __cplusplus
    union
    {
        int rows;
        int height;
    };

    union
    {
        int cols;
        int width;
    };
#else
    int rows;
    int cols;
#endif

}
CvMat;
最近写一个代码的时候,浏览一下OPENCV的源码,觉得共用体在这里还是挺方便的,但是弄不清中间的存储结构就不会很好的使用这个结构。
一、  共用体的使用大概有这几点:
 1.共用体的定义和结构体差不多

    union
    {
        uchar* ptr;
        short* s;
        int* i;
        float* fl;
        double* db;
    } data;
 2.共用体顾名思意就是里面的的数据占用同一断内存空间,共用体的内存长度等于里面最长的变量。既然占用一段内存空间,你改变任意一个共用体的变量都会改变其他 的成员,而且你不能在同一时刻使用里面的2个变量
二、指针的使用
    data共用体里面有好几种类型,如果你想写一个创建矩阵的函数,例如:
/*************************************************
函数名: CreateMatHeader
函数作用 :创建一个矩阵
参数:
     cols 列数
     rows 行数
     type 数据类型
     data 数据指针
返回:矩阵的头指针
说明:函数在使用的时候,如果data == NULL ,则创建空间
**************************************************/
CMat *CreateMat(uint cols,uint rows,MAT_DATA_TYPE type, void *data);
你事先不知道DATA的时候类型,VOID*类型不会提供关于数据长度的信息,所以在使用union data的时候你可以对数据类型进行判断,但是这样毕竟太麻烦了,最好的方法是使用union共占一段结构体的特点:直接对字节进行操作,在需要的时候再去转换为其他类型的指针
我做的一个小实验:
void main(void)
{
    float pl = (float)5.98789;           //浮点数指针
    float *data ;
    unsigned char *c ;
    c =(unsigned char*) malloc(2*sizeof(float));
    memcpy(c,&pl,sizeof(float));
    data = (float*)c ;
    printf("%f",*data);

}
我把浮点数据copy到char类型的指针下,在通过转换为浮点类型,然后输出。。。
三、VC里面的内存分配的问题
1.不同编译器分配的内存
   (1)在VC下,下面各类型占字节数为:char->unsigned int ->1; short int ->2; int ->unsigned int ->4;  long ->float->4;   double ->long double ->8

     (2)在TC下,下面各类型占字节数为:char->unsigned int ->1; short int ->2; int ->unsigned int ->2;  long ->float->4;   double ->8; long double ->10

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

高通的18核 Snapdragon X2 Elite Extreme在基准测试中占据主导地位

国防工业检测的特殊性及策略

视频 2012-05-15

GAA晶体管市场规模、份额和趋势预测(2034)

EDA/PCB 2025-09-30

电视图纸\\创维彩电(PDF)\\200683020563386483

电路板级可测试性设计与验证评估技术

视频 2012-05-15

欧洲推动光子学占据主导地位

光电显示 2025-09-30

ASML的设备是制造AI芯片的关键,但为什么它错过了AI红利

EDA/PCB 2025-09-30

非大陆供应链领军12寸SiC突围先进封装 中国也乐见其成

英特尔瞄准了AMD Threadripper及其新Granite Rapids-WS CPU

欧盟推动《芯片法案 2.0》投资

AI 驱动图形化 MCU 配置器选择器

新型机翼系统鸟类机器人实现自起飞和低速飞行

卫星导航产品模拟测试技术及应用

视频 2012-05-15

电视图纸\\创维彩电(PDF)\\200671213372035628

电视图纸\\创维彩电(PDF)\\200683020544529744

电视图纸\\创维彩电(PDF)\\200683020552394553

大嘴业话:国防电子路在何方

视频 2012-05-15

面向军工的自动化测试,维护与诊断

电视图纸\\创维彩电(PDF)\\200683020572256090

Anthropic推出全新旗舰Claude Sonnet 4.5 模型,创下AI编码记录

更多 培训课堂
更多 焦点
更多 视频

技术专区