opencv提供了多种基本数据类型,我们这里分析集中常见的类型。opencv的数据类型定义可以在D:\Program Files\opencv340\opencv\build\include\opencv2\core\types_c.h查看。
目录
1、通常作为函数参数使用
【CvArr】指代不确定类型的数组
【CVStatus】错误代码
2、公共宏与内联函数
CV_SWAP(a,b,t)交换a,b的值,t为中间变量。
CV_IMIN(a,b)无跳转求小值
CV_IMAX(a,b)无跳转求大值
CV_IABS(a)无跳转求绝对值
CV_CMP(a,b)比较两数的大小,a>b返回1,a=b返回0,a<b返回-1
CV_SIGN(a)求a的符号,正数1,零0,负数-1
cvInvSqrt(value)对参数开平方并且求倒数
cvSqrt(value)对参数开平方
【CvRNG】初始化随机数生成器
3、图像类型
【IplImage*】图像类型结构体
4、矩阵类型
【CvMat】矩阵类型
5、其它补充类型定义
【CvRect】矩形框
【CvPoint】点坐标
【CvSize & CvBox】矩形框大小与旋转矩形框
【CvScalar】一个可以用来存放4个double数值的数组
详细说明
1、通常作为函数参数使用
【CvArr】
CvArr仅被用来作为函数的的参数,用来指明函数接收的数组类型不止一个,例如IplImage*, CvMat*,甚至是CvSeq*。最终的数组类型是在运行时通过分析数组头的前四个字节来判断。
CvArr的定义如下:
typedef void CvArr;
【CVStatus】
CVStatus表示opencv的错误代码,是一个枚举型变量,代码含义见文档types_c.h的116行。
2、公共宏与内联函数
【CV_SWAP】
#define CV_SWAP(a,b,t) ((t) = (a), (a) = (b), (b) = (t))交换a,b的值,t为中间变量。
【CV_IMIN】
#define CV_IMIN(a, b) ((a) ^ (((a)^(b)) & (((a) < (b)) - 1)))无跳转求小值,这里^为异或运算,两位相同结果为0,两位不同结果为1,以上公式可以写成a^((a^b)&((a < b) - 1))。我们分两种情况讨论,
1.当a<b时,(a < b) - 1结果为0,(a^b)&0结果为0,a^0结果为a,即返回结果为a。
2.当a>=b时,(a < b) - 1结果为-1,-1的每一位均为1,所以(a^b)&-1结果为a^b,a^(a^b)结果为b,即返回结果为b。
这样就求得了a,b的小值,并且没有CV_MIN中的跳转。
【CV_IMAX】
#define CV_IMAX(a, b) ((a) ^ (((a)^(b)) & (((a) > (b)) - 1)))无跳转求大值,运算方式与CV_IMIN(a, b相似。
【CV_IABS】
无跳转求绝对值,定义如下:
#ifndef __cplusplus # define CV_IABS(a) (((a) ^ ((a) < 0 ? -1 : 0)) - ((a) < 0 ? -1 : 0)) #else # define CV_IABS(a) abs(a) #endif
【CV_CMP】
#define CV_CMP(a,b) (((a) > (b)) - ((a) < (b)))比较两数的大小,a>b返回1,a=b返回0,a<b返回-1
【CV_SIGN】
#define CV_SIGN(a) CV_CMP((a),0)求a的符号,正数1,零0,负数-1
【cvInvSqrt】
#define cvInvSqrt(value) ((float)(1./sqrt(value)))对参数开平方并且求倒数
【cvSqrt(value)】
#define cvSqrt(value) ((float)sqrt(value))对参数开平方
【CvRNG】
typedef uint64 CvRNG;初始化随机数生成器并返回其状态,指向这个状态的指针可以传递给cvRandInt、cvRandReal。
定义如下:
1 CV_INLINE CvRNG cvRNG( int64 seed CV_DEFAULT(-1)) 2 { 3 CvRNG rng = seed ? (uint64)seed : (uint64)(int64)-1; 4 return rng; 5 } 6 CV_INLINE unsigned cvRandInt( CvRNG* rng ) 7 { 8 uint64 temp = *rng; 9 temp = (uint64)(unsigned)temp*CV_RNG_COEFF + (temp >> 32); 10 *rng = temp; 11 return (unsigned)temp; 12 } 13 CV_INLINE double cvRandReal( CvRNG* rng ) 14 { 15 return cvRandInt(rng)*2.3283064365386962890625e-10 /* 2^-32 */; 16 }
3、图像类型
【IplImage*】
IplImage类型是从Intel的 Image Processing Library(IPL)库原版搬过来的。但是opencv只支持其中的部分格式。
IplImage定义如下:
1 typedef struct 2 _IplImage 3 { 4 int nSize; /**< IplImage大小 */ 5 int ID; /**< 版本(=0)*/ 6 int nChannels; /**< 大部分opencv函数支持1,2,3 或 4 个通道 */ 7 int alphaChannel; /**< Ignored by OpenCV */ 8 int depth; /**< 像素深度,主要有一下集中格式: 9 IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S, 10 IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F */ 11 char colorModel[4]; /**< Ignored by OpenCV */ 12 char channelSeq[4]; /**< 同上 */ 13 int dataOrder; /**< 0 - 交叉颜色通道, 1 - 分开颜色通道. 14 cvCreateImage只能创建交叉通道 */ 15 int origin; /**< 原点模式0 - 下-左为原点,1 - 下-左为原点. */ 16 int align; /**< 图像行排列方式 (4 or 8),在 OpenCV 被忽略, 17 使用 widthStep 代替 . */ 18 int width; /**< 图像宽像素数. */ 19 int height; /**< 图像高像素数. */ 20 struct _IplROI *roi; /**< 图像感兴趣区域,当该值非空时,只对该区域进行处理 */ 21 struct _IplImage *maskROI; /**< 在 OpenCV中必须为NULL */ 22 void *imageId; /**< 同上 */ 23 struct _IplTileInfo *tileInfo; /**<同上 */ 24 int imageSize; /**< 图像数据大小,在交叉存取格式下 25 ImageSize=image->height*image->widthStep,单位字节*/ 26 char *imageData; /**< 指向排列的图像数据 */ 27 int widthStep; /**< 排列的图像行大小,以字节为单位 */ 28 int BorderMode[4]; /**< 在 OpenCV 被忽略 */ 29 int BorderConst[4]; /**< 同上 */ 30 char *imageDataOrigin; /**< 指针指向一个不同的图像数据结构(不是必须排列的), 31 是为了纠正图像内存分配准备的 */ 32 } 33 IplImage;
4、矩阵类型
【CvMat】
1 typedef struct CvMat 2 { 3 int type; 4 int step; 5 int* refcount;/* for internal use only */ 6 int hdr_refcount; 7 union 8 { 9 uchar* ptr; 10 short* s; 11 int* i; 12 float* fl; 13 double* db; 14 } data; 15 16 #ifdef __cplusplus 17 union 18 { 19 int rows; 20 int height; 21 }; 22 23 union 24 { 25 int cols; 26 int width; 27 }; 28 #else 29 int rows; 30 int cols; 31 #endif 32 33 #ifdef __cplusplus 34 CvMat() {} 35 CvMat(const CvMat& m) { memcpy(this, &m, sizeof(CvMat));} 36 CvMat(const cv::Mat& m); 37 #endif 38 39 } 40 CvMat; 41 42 CV_INLINE CvMat cvMat( int rows, int cols, int type, void* data CV_DEFAULT(NULL)) 43 { 44 CvMat m; 45 assert( (unsigned)CV_MAT_DEPTH(type) <= CV_64F ); 46 type = CV_MAT_TYPE(type); 47 m.type = CV_MAT_MAGIC_VAL | CV_MAT_CONT_FLAG | type; 48 m.cols = cols; 49 m.rows = rows; 50 m.step = m.cols*CV_ELEM_SIZE(type); 51 m.data.ptr = (uchar*)data; 52 m.refcount = NULL; 53 m.hdr_refcount = 0; 54 return m; 55 }
【CvMatND】
1 typedef struct 2 CvMatND 3 { 4 int type; 5 int dims; 6 7 int* refcount; 8 int hdr_refcount; 9 10 union 11 { 12 uchar* ptr; 13 float* fl; 14 double* db; 15 int* i; 16 short* s; 17 } data; 18 19 struct 20 { 21 int size; 22 int step; 23 } 24 dim[CV_MAX_DIM]; 25 26 #ifdef __cplusplus 27 CvMatND() {} 28 CvMatND(const cv::Mat& m); 29 #endif 30 } 31 CvMatND;
【CvSparseMat】
多维稀疏矩阵
1 typedef struct 2 CvSparseMat 3 { 4 int type; 5 int dims; 6 int* refcount; 7 int hdr_refcount; 8 9 struct CvSet* heap; 10 void** hashtable; 11 int hashsize; 12 int valoffset; 13 int idxoffset; 14 int size[CV_MAX_DIM]; 15 16 #ifdef __cplusplus 17 void copyToSparseMat(cv::SparseMat& m) const; 18 #endif 19 } 20 CvSparseMat;
5、其它数据类型定义
【CvRect】
CvRect含4个数据成员,x、y、width、height,其功能是通过定义矩形左上角坐标和矩形的宽和高来确定一个矩形。其可与感兴趣区域ROI相互转化,定义如下:
1 typedef struct CvRect 2 { 3 int x; 4 int y; 5 int width; 6 int height; 7 } 8 CvRect;
cvRectToROI矩形框转化为感兴趣区域ROI,定义如下:
1 CV_INLINE IplROI cvRectToROI( CvRect rect, int coi ) 2 { 3 IplROI roi; 4 roi.xOffset = rect.x; 5 roi.yOffset = rect.y; 6 roi.width = rect.width; 7 roi.height = rect.height; 8 roi.coi = coi; 9 10 return roi; 11 }
cvROIToRect感兴趣区域ROI转化为矩形框,定义如下:
1 CV_INLINE CvRect cvROIToRect( IplROI roi ) 2 { 3 return cvRect( roi.xOffset, roi.yOffset, roi.width, roi.height ); 4 }
【CvPoint】
CvPoint是一个包含两个int类型变量x,y的简单结构体。CvPoint还有几种简单的变体,分别为:
CvPoint2D32f 包含两个float类型的变量x,y的结构体;
CvPoint3D32f 包含三个float类型的变量x,y,z的结构体;
CvPoint2D64f 包含两个double类型的变量x,y的结构体;
CvPoint3D64f 包含三个double类型的变量x,y,z的结构体。
CvPoint定义如下:
1 typedef struct CvPoint 2 { 3 int x; 4 int y; 5 } 6 CvPoint;
CvPoint构造函数为:
CV_INLINE CvPoint cvPoint(int x, int y);
由CvPoint2D32f转换为CvPoint如下:
1 CV_INLINE CvPoint cvPointFrom32f(CvPoint2D32f point) 2 { 3 CvPoint ipt; 4 ipt.x = cvRound(point.x); 5 ipt.y = cvRound(point.y); 6 return ipt; 7 }
其它四种变体函数定义由与CvPoint相似,如下:
1 typedef struct CvPoint2D32f 2 { 3 float x; 4 float y; 5 } 6 CvPoint2D32f; 7 typedef struct CvPoint3D32f 8 { 9 float x; 10 float y; 11 float z; 12 } 13 CvPoint3D32f; 14 typedef struct CvPoint2D64f 15 { 16 double x; 17 double y; 18 } 19 CvPoint2D64f; 20 typedef struct CvPoint3D64f 21 { 22 double x; 23 double y; 24 double z; 25 } 26 CvPoint3D64f;
【CvSize】【CvBox2D】
CvSize为矩阵框大小,以像素为精度。与CvPoint类似是由两个int类型的变量width、height构成的结构体。其变体类型为:
CvSize2D32f包含两个float类型的变量width、height的结构体。
CvSize定义如下:
1 typedef struct CvSize 2 { 3 int width; 4 int height; 5 } 6 CvSize;
CvSize构造函数为:
1 CV_INLINE CvSize cvSize(int width, int height) 2 { 3 CvSize s; 4 s.width = width; 5 s.height = height; 6 return s; 7 }
其变体CvSize2D32f与CvSize相似,不再放代码。
CvBox2D为旋转矩形框,其代码如下:
1 typedef struct CvBox2D 2 { 3 CvPoint2D32f center; /**< 矩形框的中心 */ 4 CvSize2D32f size; /**< 矩形框的尺寸 */ 5 float angle; /**< 矩形框与水平轴的角度 */ 6 } 7 CvBox2D;
【CvScalar】
CvScalar就是一个可以用来存放4个double数值的数组,一般用来存放像素值(不一定是灰度值哦)的,最多可以存放4个通道的。
1 typedef struct CvScalar 2 { 3 double val[4]; 4 } 5 CvScalar; 6 7 CV_INLINE CvScalar cvScalar( double val0, double val1 CV_DEFAULT(0), 8 double val2 CV_DEFAULT(0), double val3 CV_DEFAULT(0)) 9 { 10 CvScalar scalar; 11 scalar.val[0] = val0; scalar.val[1] = val1; 12 scalar.val[2] = val2; scalar.val[3] = val3; 13 return scalar; 14 }
使用cvScalar表示颜色时,
cvScalar(blue_component, green_component, red_component[, alpha_component])