新闻  |   论坛  |   博客  |   在线研讨会
共用体与OPENCV里面矩阵的定义
0750long | 2009-06-08 12:44:40    阅读:2183   发布文章

共用体与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

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客