这些数据结构的定义基本上都在"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,只需要添加一个coiCV_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;由图中可以看到,维数为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等。
 
                    
                 

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号