標籤:

【opencv學習筆記三】opencv3.4.0數據類型解釋

opencv提供了多種基本數據類型,我們這裡分析集中常見的類型。opencv的數據類型定義可以在D:Program Filesopencv340opencvuildincludeopencv2core ypes_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。

定義如下:

CV_INLINE CvRNG cvRNG( int64 seed CV_DEFAULT(-1)){ CvRNG rng = seed ? (uint64)seed : (uint64)(int64)-1; return rng;}CV_INLINE unsigned cvRandInt( CvRNG* rng ){ uint64 temp = *rng; temp = (uint64)(unsigned)temp*CV_RNG_COEFF + (temp >> 32); *rng = temp; return (unsigned)temp;}CV_INLINE double cvRandReal( CvRNG* rng ){ return cvRandInt(rng)*2.3283064365386962890625e-10 /* 2^-32 */;}

3、圖像類型

【IplImage*】

IplImage類型是從Intel的 Image Processing Library(IPL)庫原版搬過來的。但是opencv只支持其中的部分格式。

IplImage定義如下:

typedef struct_IplImage{ int nSize; /**< IplImage大小 */ int ID; /**< 版本(=0)*/ int nChannels; /**< 大部分opencv函數支持1,2,3 或 4 個通道 */ int alphaChannel; /**< Ignored by OpenCV */ int depth; /**< 像素深度,主要有一下集中格式: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F */ char colorModel[4]; /**< Ignored by OpenCV */ char channelSeq[4]; /**< 同上 */ int dataOrder; /**< 0 - 交叉顏色通道, 1 - 分開顏色通道. cvCreateImage只能創建交叉通道 */ int origin; /**< 原點模式0 - 下-左為原點,1 - 下-左為原點. */ 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;

4、矩陣類型

【CvMat】

矩陣由寬度(width),高度(height),類型(type),行數據長度(step,行的長度用位元組表示而不是用整形或者浮點型長度)和一個指向數據的指針構成。此類信息通常被稱作矩陣頭。很多程序是區分矩陣頭和數據體的,後者是各個data成員所指向的內存位置。CvMat的定義如下:

typedef struct CvMat

{

int type;

int step;

int* refcount;/* for internal use only */

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

#ifdef __cplusplus

CvMat() {}

CvMat(const CvMat& m) { memcpy(this, &m, sizeof(CvMat));}

CvMat(const cv::Mat& m);

#endif

}

CvMat;

CV_INLINE CvMat cvMat( int rows, int cols, int type, void* data CV_DEFAULT(NULL)){ CvMat m; assert( (unsigned)CV_MAT_DEPTH(type) <= CV_64F ); type = CV_MAT_TYPE(type); m.type = CV_MAT_MAGIC_VAL | CV_MAT_CONT_FLAG | type; m.cols = cols; m.rows = rows; m.step = m.cols*CV_ELEM_SIZE(type); m.data.ptr = (uchar*)data; m.refcount = NULL; m.hdr_refcount = 0; return m;}

【CvMatND】

多維密集矩陣

typedef structCvMatND{ 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];#ifdef __cplusplus CvMatND() {} CvMatND(const cv::Mat& m);#endif}CvMatND;

【CvSparseMat】

多維稀疏矩陣

typedef structCvSparseMat{ int type; int dims; int* refcount; int hdr_refcount; struct CvSet* heap; void** hashtable; int hashsize; int valoffset; int idxoffset; int size[CV_MAX_DIM];#ifdef __cplusplus void copyToSparseMat(cv::SparseMat& m) const;#endif}CvSparseMat;

5、其它數據類型定義

【CvRect】

CvRect含4個數據成員,x、y、width、height,其功能是通過定義矩形左上角坐標和矩形的寬和高來確定一個矩形。其可與感興趣區域ROI相互轉化,定義如下:

typedef struct CvRect{ int x; int y; int width; int height;}CvRect;

cvRectToROI矩形框轉化為感興趣區域ROI,定義如下:

CV_INLINE IplROI cvRectToROI( CvRect rect, int coi ){ IplROI roi; roi.xOffset = rect.x; roi.yOffset = rect.y; roi.width = rect.width; roi.height = rect.height; roi.coi = coi; return roi;}

cvROIToRect感興趣區域ROI轉化為矩形框,定義如下:

CV_INLINE CvRect cvROIToRect( IplROI roi ){ return cvRect( roi.xOffset, roi.yOffset, roi.width, roi.height );}

【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定義如下:

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

CvPoint構造函數為:

CV_INLINE CvPoint cvPoint(int x, int y);

由CvPoint2D32f轉換為CvPoint如下:

CV_INLINE CvPoint cvPointFrom32f(CvPoint2D32f point){ CvPoint ipt; ipt.x = cvRound(point.x); ipt.y = cvRound(point.y); return ipt;}

其它四種變體函數定義由與CvPoint相似,如下:

typedef struct CvPoint2D32f{ float x; float y;}CvPoint2D32f;typedef struct CvPoint3D32f{ float x; float y; float z;}CvPoint3D32f;typedef struct CvPoint2D64f{ double x; double y;}CvPoint2D64f;typedef struct CvPoint3D64f{ double x; double y; double z;}CvPoint3D64f;

【CvSize】【CvBox2D】

CvSize為矩陣框大小,以像素為精度。與CvPoint類似是由兩個int類型的變數width、height構成的結構體。其變體類型為:

CvSize2D32f包含兩個float類型的變數width、height的結構體。

CvSize定義如下:

typedef struct CvSize{ int width; int height;}CvSize;

CvSize構造函數為:

CV_INLINE CvSize cvSize(int width, int height){ CvSize s; s.width = width; s.height = height; return s;}

其變體CvSize2D32f與CvSize相似,不再放代碼。

CvBox2D為旋轉矩形框,其代碼如下:

typedef struct CvBox2D{ CvPoint2D32f center; /**< 矩形框的中心 */ CvSize2D32f size; /**< 矩形框的尺寸 */ float angle; /**< 矩形框與水平軸的角度 */}CvBox2D;

【CvScalar】

CvScalar就是一個可以用來存放4個double數值的數組,一般用來存放像素值(不一定是灰度值哦)的,最多可以存放4個通道的。

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)){ CvScalar scalar; scalar.val[0] = val0; scalar.val[1] = val1; scalar.val[2] = val2; scalar.val[3] = val3; return scalar;}

使用cvScalar表示顏色時,

cvScalar(blue_component, green_component, red_component[, alpha_component])

推薦閱讀:

新手學opencv怎麼做?opencv各個版本有什麼區別?
【opencv學習筆記四】opencv3.4.0圖形用戶介面highgui函數解析
OpenCV人臉識別之二:模型訓練

TAG:OpenCV |