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

 

 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】

 

矩陣由寬度(width),高度(height),類型(type),行數據長度(step,行的長度用字節表示而不是用整形或者浮點型長度)和一個指向數據的指針構成。此類信息一般被稱做矩陣頭。不少程序是區分矩陣頭和數據體的,後者是各個data成員所指向的內存位置。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;

 

 

五、其它數據類型定義

 

【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])
相關文章
相關標籤/搜索