OpenCV提供了多種基本數據類型。雖然這些數據類型在C語言中不是基本類型,但結構都很簡單,可將它們作為原子類型。可以在"…/OpenCV/cxcore/include"目錄下的cxtypes.h文件中查看其詳細定義。
在這些數據類型中最簡單的就是CvPoint。CvPoint是一個包含integer類型成員x和y的簡單結構體。CvPoint有兩個變體類型:CvPoint2D32f和CvPoint3D32f。前者同樣有兩個成員x,y,但它們是浮點類型;而後者卻多了一個浮點類型的成員z。
CvSize類型與CvPoint非常相似,但它的數據成員是integer類型的width和height。如果希望使用浮點類型,則選用CvSize的變體類型CvSize2D32f。
CvRect類型派生於CvPoint和CvSize,它包含4個數據成員:x,y,width和height。(正如你所想的那樣,該類型是一個復合類型)。
下一個(但不是最後一個)是包含4個整型成員的CvScalar類型,當內存不是問題時,CvScalar經常用來代替1,2或者3個實數成員(在這個情況下,不需要的分量被忽略)。CvScalar有一個單獨的成員val,它是一個指向4個雙精度浮點數數組的指針。
所有這些數據類型具有以其名稱來定義的構造函數,例如cvSize()。(構造函數通常具有與結構類型一樣的名稱,只是首字母不大寫)。記住,這是C而不是C++,所以這些構造函數只是內聯函數,它們首先提取參數列表,然後返回被賦予相關值的結構。
各數據類型的內聯構造函數被列在表3-1中:cvPointXXX(),cvSize(),cvRect()和cvScalar()。這些結構都十分有用,因為它們不僅使代碼更容易編寫,而且也更易於閱讀。假設要在(5,10)和(20,30)之間畫一個白色矩形,只需簡單調用:
cvRectangle(myImg, cvPoint(5,10),cvPoint(20,30),cvScalar(255,255,255));表1:points,size, rectangles和calar三元組的結構
結構
成員
意義
CvPoint
intx, y
圖像中的點
CvPoint2D
floatx, y
二維空間中的點
CvPoint3D
floatx, y, z
三維空間中的點
CvSize
intwidth,
height
圖像的尺寸
CvRect
intx, y,
width,height
圖像的部分區域
CvScalar
doubleval[4]
RGBA值
cvScalar是一個特殊的例子:它有3個構造函數。第一個是cvScalar(),它需要一個、兩個、三個或者四個參數並將這些參數傳遞給數組val[]中的相應元素。第二個構造函數是cvRealScalar(),它需要一個參數,它被傳遞給給val[0],而val[]數組別的值被賦為0。最後一個有所變化的是cvScalarAll(),它需要一個參數並且val[]中的4個元素都會設置為這個參數。
CvPoint
二維坐標系下的點,類型為整型
typedef struct CvPoint
{
int x; /* X坐標, 通常以0為基點 */
int y; /* y坐標, 通常以0為基點 */
}
CvPoint;
/* 構造函數 */
inline CvPoint cvPoint( int x, int y );
/* 從 CvPoint2D32f類型轉換得來 */
inline CvPoint cvPointFrom32f( CvPoint2D32f point )
CvPoint2D32f
二維坐標下的點,類型為浮點
typedef struct CvPoint2D32f
{
float x; /* X坐標, 通常以0為基點*/
float y; /* Y坐標, 通常以0為基點*/
}
CvPoint2D32f;
/* 構造函數 */
inline CvPoint2D32f cvPoint2D32f( double x, double y );
/* 從CvPoint轉換來 */
inline CvPoint2D32f cvPointTo32f( CvPoint point );
CvSize
矩形框大小,以像素為精度
typedef struct CvSize
{
int width; /* 矩形寬 */
int height; /* 矩形高 */
}
CvSize;
/* 構造函數 */
inline CvSize cvSize( int width, int height );
注意:構造函數的cv是小寫!
CvSize2D32f
以亞像素精度標量矩形框大小
typedef struct CvSize2D32f
{
float width; /* 矩形寬 */
float height; /* 矩形高 */
}
CvSize2D32f;
/* 構造函數*/
inline CvSize2D32f cvSize2D32f( double width, double height );
{
CvSize2D32f s;
s.width = (float)width;
s.height = (float)height;
return s;
}
CvRect
矩形框的偏移和大小
typedef struct CvRect
{
int x; /* 方形的最左角的x-坐標 */
int y; /* 方形的最上或者最下角的y-坐標 */
int width; /* 寬 */
int height; /* 高 */
}
CvRect;
/* 構造函數*/
inline CvRect cvRect( int x, int y, int width, int height );
{
CvRect os;
os.x = x;
os.y = y;
os.width = width;
os.height = heigth;
reture os;
}
CvScalar
可存放在1-,2-,3-,4-TUPLE類型的捆綁數據的容器
typedef struct CvScalar
{
double val[4]
}
CvScalar;
/* 構造函數:用val0初始化val[0]用val1初始化val[1], 以此類推*/
inline CvScalar cvScalar( double val0, double val1,
double val2, double val3);
{ CvScalar arr;
arr.val[4] = {val0,val1,val2,val3};
reture arr;
}
//最通用的,可初始化0-4個通道
舉例:
a)存放單通道圖像中像素:cvScalar(255);
b)存放三通道圖像中像素:cvScalar(255,255,255);
/* 構造函數:用val0123初始化所有val[0]...val[3] */
inline CvScalar cvScalarAll( double val0123 );
{ CvScalar arr;
arr.val[4] = {val0123,val0123,val0123,val0123,};
reture arr;}
/* 構造函數:用val0初始化val[0],用0初始化val[1],val[2],val[3] */
inline CvScalar cvRealScalar( double val0 );
{
CvScalar arr;
arr.val[4] = {val0};
reture arr;
}
CV_RGB
CV_RGB是OPENCV中的一個宏,用於創建一個色彩值:
#defineCV_RGB(r,g,b) cvScalar((b),(g),(r),0)。
看到轉換為cvScalar時,rgb的順序變為bgr,這是因為opencv中存儲RGB模式彩圖時,采用的通道順序是BGR.
舉例:CvScalarcolor = CV_RGB( rand()&255, rand()&255,rand()&255 )