opencv提供了多種基本數據類型,咱們這裏分析集中常見的類型。opencv的數據類型定義能夠在D:\Program Files\opencv340\opencv\build\include\opencv2\core\types_c.h查看。數組
目錄數據結構
一、一般做爲函數參數使用函數
【CvArr】指代不肯定類型的數組ui
【CVStatus】錯誤代碼this
二、公共宏與內聯函數spa
CV_SWAP(a,b,t)交換a,b的值,t爲中間變量。scala
CV_IMIN(a,b)無跳轉求小值指針
CV_IMAX(a,b)無跳轉求大值code
CV_IABS(a)無跳轉求絕對值component
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】初始化隨機數生成器
三、圖像類型
【IplImage*】圖像類型結構體
四、矩陣類型
【CvMat】矩陣類型
五、其它補充類型定義
【CvRect】矩形框
【CvPoint】點座標
【CvSize & CvBox】矩形框大小與旋轉矩形框
【CvScalar】一個能夠用來存放4個double數值的數組
詳細說明
一、一般做爲函數參數使用
【CvArr】
CvArr僅被用來做爲函數的的參數,用來指明函數接收的數組類型不止一個,例如IplImage*, CvMat*,甚至是CvSeq*。最終的數組類型是在運行時經過分析數組頭的前四個字節來判斷。
CvArr的定義以下:
typedef void CvArr;
【CVStatus】
CVStatus表示opencv的錯誤代碼,是一個枚舉型變量,代碼含義見文檔types_c.h的116行。
二、公共宏與內聯函數
【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 }
三、圖像類型
【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;
四、矩陣類型
【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 }
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;
五、其它數據類型定義
【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])