opencv學習之一

2021-06-14 01:08:11 字數 3119 閱讀 9099

對有關opencv的基礎知識做一系列的總結,今天是第一節

第一章

1.1介紹

opencv(open source computer vision library)是乙個基於bsd協議的開源庫,它包含了數百個計算機視覺的演算法實現。這個文件描述了opencv 2.x的api函式,這個版本的api是基於c++,而早期的1.x版本的opencv是基於c語言的。後者在opencv 1x.pdf中給出了描述。

opencv具有模組化結構,這意味著程式包中包含著一些動態和靜態的庫。以下列出的是可用的模組:

接下來的文件描述了各個模組的功能。但是首先要確保弄明白通常情況下庫中的api函式是怎樣使用的。

第二章

核心——核心函式

2.1 基礎結構

資料型別

類:datatype

opencv原始資料型別的特徵模版。opencv的原始資料型別包括unsigned char、bool、signed char、unsigned short、signed short、int、float、double以及由這些基礎型別組成的元組,這些元組中的所有值都屬於相同的型別。這個原始資料型別列表中的所有型別都可以使用乙個標示符進行表示cv_c(),例如,uchar ~ cv_8uc1,3元素的浮點元組~ cv_32fc3,等等。乙個一般的opencv結構體能夠被儲存到乙個單獨的例項中,例如乙個原始資料型別vec。多個例項可以被儲存在std::vector、mat、mat_、sparsemat、oparsemat_或其他可以儲存vec例項的容器中。

datatype類主要用來為原始資料型別提供描述,同時它不會給對應的類加入子段和方法(實際上不可能修改c/c++的原始資料型別)。這個技術依賴於c++的類特性。datatype本身並不會被使用,但是他的特殊版本會被使用,例如:

template<> class datatype;};

...templatedatatype>;};

...這個類的主要的目的是為為opencv的相容資料型別標示符轉換編譯型別資訊,例如:

// 申請乙個 30x40 浮點矩陣

mat a(30, 40, datatype::type);

mat b = mat_>(3, 3);

// 下邊將會列印出6,2,意思是depth == cv_64f,channels == 2

cout << b.depth() << ", " << b.channels() << endl;

所以這個特性用來告訴opencv你當前在使用什麼資料型別,即使這個型別並非源自於opencv。例如,矩陣b將會被編譯,因為opencv定義了專門的模版類datatype>。這個機制也用於泛型機制。

point_

類:point_

2d點的模板類,用來描述它的x和y座標。這個類的例項可以與c結構體cvpoint和cvpoint2d32f之間進行互相轉換。其中有型別轉換運算子將點的座標轉換成指定的型別。將浮點型座標轉換成整形座標要通過捨入來完成。通常,轉換工作會對每乙個座標執行這個操作。除了上邊提到的類成員,以下列出的其它對點的使用操作:

pt1 = pt2 + pt3;

pt1 = pt2 - pt3;

pt1 = pt2 * a;

pt1 = a * pt2;

pt1 += pt2;

pt1 -= pt2;

pt1 *= a;

double value = norm(pt); // l2 norm

pt1 == pt2;

pt1 != pt2;

為了使用方便,還定義了下邊的類別名:

typedef point_point2i;

typedef point2i point;

typedef point_point2f;

typedef point_point2d;

例如:point2f a(0.3f, 0.f), b(0.f, 0.4f);

point pt = (a + b)*10.f;

cout << pt.x << ", " << pt.y << endl;

point3_

類:point3_

3d點的模板類,用來描述它的x、y和z座標。這個類的例項可以與c結構體cvpoint2d32f之間進行互相轉換。與point_相似,3d座標可以被轉換成其他型別。同時這個類也支援vector和比較操作。

point3_<>有以下可用的別名:

typedef point3_point3i;

typedef point3_point3f;

typedef point3_point3d;

size_

類:size_

用於指定影象和矩形尺寸的類模板。這個類包含兩個成員變數width和height。這個結構體可以與老版opencv中的cvsize和cvsized32f之間進行轉換。能夠應用於point_類的演算法和比較操作對size_也是有效的。

opencv定義了以下size_<>的別名:

typedef size_size2i;

typedef size2i size;

typedef size_size2f;

rect_

類:rect_

2d矩形的模板類,用以下引數進行描述:

opencv假設矩形的上邊沿和左邊沿是包含的,而右邊沿和下邊沿是不包含的。例如,如果符合以下情況,則方法rect_::contains將返回true:

x 實際上在opencv中迴圈瀏覽乙個影象的roi(roi被通過rect_指定)是這樣實現的:

for(int y = roi.y; y < roi.y + rect.height; y++)

for(int x = roi.x; x < roi.x + rect.width; x++)

除了成員變數,以下對於矩形的操作也得到了實現:

下邊是乙個如何確定矩形包含關係的例子(rect1屬於rect2):

templateinline bool

operator <= (const rect_<_tp>& r1, const rect_<_tp>& r2)

為了便利,rect_<>有以下別名:

typedef rect_rect;

OpenCv學習之一 模版匹配

include opencv2 highgui highgui.hpp include opencv2 imgproc imgproc.hpp include using namespace std using namespace cv 全域性變數 mat img mat img2 mat temp...

Opencv 入門之 一

include include using namespace std using namespace cv int main int argc,char argv namedwindow display image window autosize 建立視窗 imshow display image...

opencv學習筆記之一(資料的複製)

這次主要是想說乙個opencv中的資料共享機制。先看程式 include include include using namespace std using namespace cv mat function int main 程式做了一下幾件事情 讀入image,並利用 copyto clone等...