歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> OpenCV基礎結構

OpenCV基礎結構

日期:2017/3/1 10:05:26   编辑:Linux編程

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 )

Copyright © Linux教程網 All Rights Reserved