博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

学习OpenCV2.3.1一:Cxcore基本数据结构

Posted on 2011-08-17 20:13  yuanzfy  阅读(1694)  评论(0)    收藏  举报

这些数据结构的定义基本上都在"types_c.h”里,具体可以读源码。

Cvpoint,CvPoint2D32f,CvPoint3D32f,CvPoint2D64f,CvPoint3D64f

typedef struct CvPoint{
	int x;
	int y;
}CvPoint;

CvSize,CvSize2D32f,CvBox2D

typedef struct{
	int width;
   	int height;
}CvSize;
typedef struct CvBox2D{
    	CvPoint2D32f center;  /* Center of the box.*/
    	CvSize2D32f  size;    /* Box width and length.       */
    	float angle;          /* Angle between the horizontal axis */
                               /* and the first side (i.e. length) in degrees */
}CvBox2D;
CV_INLINE  CvSize2D32f  cvSize2D32f( double width, double height );

CvRect,IplROI

typedef struct CvRect{
	int x; /* 方形的最左角的x-坐标 */
	int y; /* 方形的最上或者最下角的y-坐标 */
	int width;
	int height;
}CvRect;
typedef struct _IplROI{
	int  coi; /* 0 - no COI (all channels are selected), 1 - 0th channel is 	selected ...*/
	int  xOffset;
	int  yOffset;
	int  width;
	int  height;
}IplROI;
//CvRect构造函数 
CV_INLINE CvRect cvRect( int x, int y, int width, int height ); 
//CvRect转换为IplROI,只需要添加一个coi 
CV_INLINE IplROI cvRectToROI( CvRect rect, int coi );
//IplROI转换为CvRect,只需要舍弃一个
coi CV_INLINE CvRect cvROIToRect( IplROI roi ); 

      ROI :Region of Interest,表示感兴趣的区域

      COI :Channel of Interest,表示感兴趣的通道

      CvRect是一块矩形区域,IplROI和CvRect只比CvRect多了一个变量coi。

CvScalar

typedef struct CvScalar{
	double val[4];
}CvScalar;
CV_INLINE  CvScalar  cvScalar( double val0, double val1 CV_DEFAULT(0),double val2 CV_DEFAULT(0), double val3 CV_DEFAULT(0));
CV_INLINE  CvScalar  cvRealScalar( double val0 );
CV_INLINE  CvScalar  cvScalarAll( double val0123 );
CV_DEFAULT(0)是一个宏定义#define CV_DEFAULT(var) = var,看着很不爽。
这个结构体不知道迷惑了多少初学者,感觉说的神乎其神的,就把它看成个结构体,只赋一个值时可以当个实数,赋两个时可以当个点,赋三个时可以当做颜色变量,爱怎么用怎么用。

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;
CV_INLINE CvMat cvMat( int rows, int cols, int type, void* data CV_DEFAULT(NULL));
 
openCV的矩阵类型,介绍一下他的主要变量:
type:表示矩阵的元素类型和标识,在"types_c.h”中有其一系列定义,看一看到都是由如下宏定义生成
#define CV_CN_MAX     512
#define CV_CN_SHIFT   3
#define CV_DEPTH_MAX  (1 << CV_CN_SHIFT)

#define CV_8U   0
#define CV_8S   1
#define CV_16U  2
#define CV_16S  3
#define CV_32S  4
#define CV_32F  5
#define CV_64F  6
#define CV_USRTYPE1 7

#define CV_MAT_DEPTH_MASK       (CV_DEPTH_MAX - 1)
#define CV_MAT_DEPTH(flags)     ((flags) & CV_MAT_DEPTH_MASK)

#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
#define CV_MAKE_TYPE CV_MAKETYPE

 

      作用:#define CV_MAKETYPE(depth,cn) 宏读入位深度depth和通道数cn生成矩阵类型type。

      其中depth用三位就可以表示,作为低三位,cn最大值为512,把cn-1作为高9位,生成可达12位的type,例如CV_16UC2。

      step表示矩阵每行数据占用的字节长度。

      data是一个联合变量,是为了节省内存并且能够支持更多的数据类型,直接用mat.data.ptr或者mat.data.fl调用即可,并且在向矩阵赋值的时候,可以赋给几个指针的任何一个,因为他们都指向同一块内存。      

CvMatND

      这是openCV中的多维、多通道密集数组类型。

typedef struct CvMatND{
	int type;
	int dims;

	int* refcount;
	int hdr_refcount;

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

	struct
	{
		int size;
		int step;
	}	
	dim[CV_MAX_DIM];
}CvMatND;
/* Allocates and initializes CvMatND header创建一个数据区为空的空矩阵*/
CVAPI(CvMatND*)  cvCreateMatNDHeader( int dims, const int* sizes, int type );

/* Allocates and initializes CvMatND header and allocates data 创建一个空矩阵,并且分配了数据地址空间*/
CVAPI(CvMatND*)  cvCreateMatND( int dims, const int* sizes, int type );

/* Initializes preallocated CvMatND header 为一个已创建的矩阵头进行初始化*/
CVAPI(CvMatND*)  cvInitMatNDHeader( CvMatND* mat, int dims, const int* sizes,
                                    int type, void* data CV_DEFAULT(NULL) );

/* Releases CvMatND 释放矩阵*/
CV_INLINE  void  cvReleaseMatND( CvMatND** mat )
{
    cvReleaseMat( (CvMat**)mat );
}

/* Creates a copy of CvMatND (except, may be, steps) 创建一个矩阵副本*/
CVAPI(CvMatND*) cvCloneMatND( const CvMatND* mat );

      大部分变量都和CvMat一样,多了一些表示多位矩阵参数的变量。

      dims表示CvMatND的维数。dim[CV_MAX_DIM]是一个保存各维参数的变量,size表示各维元素个数,step表示各维元素大小。

      举例:

CvMatND *nd1;
int size[5]={2,3,4,5,6};
nd1=cvCreateMatNDHeader(5,size,CV_16UC2);	
int data[2*3*4*5*16*2]={0};
nd1->data.ptr=(uchar*)data;
 

      image

      由图中可以看到,维数为5,data中个指针都指向都一个内存地址,dim[4]表示第五维,包含六个元素,type设置为CV_16UC2,表示每个元素由两个16位整数组成,所以每个元素为4个字节即step=4,所以dim[3]表示的第四维的每个元素大小为第五维总大小size*step=24,以此类推。

IplImage

typedef struct _IplImage{
    int  nSize;             /* sizeof(IplImage) */
    int  ID;                /* version (=0)*/
    int  nChannels;         /* Most of OpenCV functions support 1,2,3 or 4 channels */
    int  depth;             /* Pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S,
                               IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported.  */
    int  dataOrder;         /* 0 - interleaved color channels, 1 - separate color channels.
                               cvCreateImage can only create interleaved images */
    int  origin;            /* 0 - top-left origin,
                               1 - bottom-left origin (Windows bitmaps style).  */
    int  width;             /* Image width in pixels.                           */
    int  height;            /* Image height in pixels.                          */
    struct _IplROI *roi;    /* Image ROI. If NULL, the whole image is selected. 
                               图像感兴趣区域. 当该值非空只对该区域进行处理 */
    int  imageSize;         /* Image data size in bytes
                               (==image->height*image->widthStep
                               in case of interleaved data)*/
    char *imageData;        /* Pointer to aligned image data.         */
    int  widthStep;         /* Size of aligned image row in bytes.    
                               图像行大小,以字节为单位*/
    char *imageDataOrigin;  /* Pointer to very origin of image data (not necessarily aligned) -
                               needed for correct deallocation 
                               指针指向一个不同的图像数据结构(不是必须排列的),是为了纠正图像内存分配准备的*/
}IplImage;

CvArr

      typedef void CvArr;//一般用来作为函数的参数,这样函数可以接收不同类型的指针IplImage*或CvMat等。