您的位置:首页 > 理论基础 > 数据结构算法

Opencv学习笔记(二):Opencv中的基本数据类型与数据结构

2013-12-09 20:11 489 查看
Opencv中的基本数据类型与数据结构
Last Edit 2013/12/9
1.矩阵数据类型与图像数据类型
矩阵数据类型:相当于C语言中一个二维数据中的数据类型,比如int,float,char等。在Opencv中,矩阵的数据类型 有:(S:带符号整数,U:不带符号整数;F:浮点数)
CV_8UC1: 8位无符号型的单通道矩阵;
CV_32FC2: 32位浮点型双通道矩阵;
....
这个矩阵数据类型一般会在,分配矩阵的函数中使用:CvMat *cvCreateMat(int rows,int cols,int type),其中这个type就是上面矩阵数据类型;

图像数据类型:通用的形式为:IPL_DEPTH_<8,32,64>(S|U|F),这个IPL是Intel Image Processing Library的简写;
IPL_DEPTH_8U; 8位无符号整数;
IPL_DEPTH_32F: 32位的浮点数;

2.常用数据结构
1)CvPoint: 只能用于定义整形的点
CvPoint 
二维坐标系下的点,类型为整型 
typedef struct CvPoint
{
int x; /* X坐标, 通常以0为基点 */
int y; /* y坐标, 通常以0为基点 */
}
CvPoint;
/* 构造函数 */
inline CvPoint cvPoint( int x, int y );
/* 从 CvPoint2D32f类型转换得来 */
inline CvPoint cvPointFrom32f( CvPoint2D32f point )
注意区分,CvPoint ,cvPoint,一个是数据类型,一个构造函数。

2)CvPoint2D32f: 二维浮点形的点
CvPoint2D32f 
二维坐标下的点,类型为浮点 
typedef struct CvPoint2D32f
{
float x; /* X坐标, 通常以0为基点*/
float y; /* Y坐标, 通常以0为基点*/
}
CvPoint2D32f;
/* 构造函数 */
inline CvPoint2D32f cvPoint2D32f( double x, double y );
/* 从CvPoint转换来 */
inline CvPoint2D32f cvPointTo32f( CvPoint point );


3)CvPoint3D32f: 三维浮点形的点
typedef struct CvPoint3D32f
{
float x; /* x-坐标, 通常基于0 */
float y; /* y-坐标, 通常基于0 */
float z; /* z-坐标, 通常基于0 */
}
CvPoint3D32f;
/* 构造函数 */
inline CvPoint3D32f cvPoint3D32f( double x, double y, double z );


4)CvSize:以像素为单位定义的矩形框大小,但没指明这个矩形框中图像中的位置
typedef struct CvSize
{
int width; /* 矩形宽 */
int height; /* 矩形高 */
}
CvSize;
/* 构造函数 */
inline CvSize cvSize( int width, int height );


5)CRect:定义矩形框的偏移和大小,注意与上面的CSize做区分
typedef struct CvRect
{
int x; /* 方形的最左角的x-坐标 */
int y; /* 方形的最上或者最下角的y-坐标 */
int width; /* 宽 */
int height; /* 高 */
}
CvRect;
/* 构造函数*/
inline CvRect cvRect( int x, int y, int width, int height );


6)CvScalar:可存放1~4个数值的数组
typedef struct CvScalar
{
double val[4]
}
CvScalar;
/* 构造函数:用val0初始化val[0]用val1初始化val[1], 以此类推*/
inline CvScalar cvScalar( double val0, double val1=0,double val2=0, double val3=0 );
/* 构造函数:用val0123初始化所有val[0]...val[3] */
inline CvScalar cvScalarAll( double val0123 );
/* 构造函数:用val0初始化val[0],用0初始化val[1],val[2],val[3] */
inline CvScalar cvRealScalar( double val0 );


7)CvMat :多通道矩阵

typedef struct CvMat
{
int type; /* CvMat 标识 (CV_MAT_MAGIC_VAL), 元素类型和标记 */
int step; /* 以字节为单位的行数据长度*/
int* refcount; /* 数据引用计数 */
union
{
uchar* ptr;
short* s;
int* i;
float* fl;
double* db;
} data; /* data 指针 */   矩阵中数据的类型
#ifdef __cplusplus
union
{
int rows;
int height;
};
union
{
int cols;
int width;
};
#else
int rows; /* 行数 */
int cols; /* 列数*/
#endif
} CvMat;


8)IplImage:图像结构,包含图像的信息:大小,通道数,像素深度,排列图像的行大小
typedef struct _IplImage
{
int nSize;          /* IplImage大小 */
int ID;             /* 版本 (=0)*/
int nChannels;      /* 大多数OPENCV函数支持1,2,3 或 4 个通道 */
int alphaChannel;   /* 被OpenCV忽略 */
int depth;          /* 像素的位深度: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,
                    IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F 可支持 */
char colorModel[4]; /* 被OpenCV忽略 */
char channelSeq[4]; /* 同上 */
int dataOrder;      /* 0 - 交叉存取颜色通道, 1 - 分开的颜色通道.
                    cvCreateImage 只能创建交叉存取图像 */
int origin;         /* 0 - 顶—左结构, 1 - 底—左结构 (Windows bitmaps 风格) */
int align;         /* 图像行排列 (4 or 8). OpenCV 忽略它,使用 widthStep 代替 */
int width;         /* 图像宽像素数 */
int height;        /* 图像高像素数*/
struct _IplROI *roi;/* 图像感兴趣区域. 当该值非空只对该区域进行处理 */
struct _IplImage *maskROI; /* 在 OpenCV中必须置NULL */
void *imageId;     /* 同上*/
struct _IplTileInfo *tileInfo; /*同上*/
int imageSize;     /* 图像数据大小(在交叉存取格式下imageSize=image->height*image->widthStep),单位字节*/
char *imageData;    /* 指向排列的图像数据 */
int widthStep;      /* 排列的图像行大小,以字节为单位 */
int BorderMode[4];  /* 边际结束模式, 被OpenCV忽略 */
int BorderConst[4];   /* 同上 */
char *imageDataOrigin; /* 指针指向一个不同的图像数据结构(不是必须排列的),是为了纠正图像内存分配准备的 */
}
IplImage;


9)CvArr:这是一个图像结构的通用类型,主要用于函数的参数中,表示函数可以用来接受不同的图像数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: