1. 程式人生 > >OpenCV學習筆記(四十一)——再看基礎資料結構core

OpenCV學習筆記(四十一)——再看基礎資料結構core

記得我在OpenCV學習筆記(四)——新版本的資料結構core裡面講過新版本的資料結構了,可是我再看這部分的時候,我發現我當時實在是看得太馬虎了。對於新版本的資料結構,我再說說。

Point_類不用多言,裡面兩個成員變數x,y。Point_<int>就是Point2i,也是Point,Point_<float>就是Point2f,Point_<double>就是Point2d

Point3_類不太常用,跟Point_類差不太多,成員變數x,y,z

Size_類成員變數width、height。Size_<int>就是Size2i,也是Size

,Size_<float>就是Size2f大家就要不臆斷出來個Size2d啥的讓編譯器發懵了

Rect_類有些意思,成員變數x、y、width、height,分別為左上角點的座標和矩形的寬和高。常用的成員函式有Size()返回值為一個Size,area()返回矩形的面積,contains(Point)用來判斷點是否在矩形內,inside(Rect)函式判斷矩形是否在該矩形內,tl()返回左上角點座標,br()返回右下角點座標。值得注意的是,如果想求兩個矩形的交集,並集,可以用如下格式

Rect rect = rect1 & rect2;
Rect rect = rect1 | rect2;
如果想讓矩形平移操作,縮放操作,甚至可以這樣寫
Rect rectShift = rect + point;
Rect rectScale = rect + size;
是不是很妙,可以大大減輕你的程式碼量。

Matx其實是個輕量級的Mat,必須在使用前規定好大小,比如一個2*3的float型的可以宣告為Matx23f。我想很容易理解的。

Vec是Matx的一個派生類,就是一個1維的Matx,跟vector很相似。比如想宣告一個10個數據的float陣列,可以寫成Vec2f。

這樣就很容易引出一個大家經常使用的資料結構了,Scalar_類,這個類其實就是一個Vec4x的一個變種,大家常用的Scalar

其實就是Scalar_<double>。這樣一說,大家是不是就很容易理解了,為啥很多函式的引數輸入可以是Mat,也可以是Scalar了。其實OpenCV定義的InputMat,outputMat引數格式,以上的這幾種資料結構都可以作為引數的

接下來介紹一個有意思的類Range,大家可能用的不多,對它不熟悉,其實它就是為了使OpenCV的使用更像Matlab而產生的。比如Range::all()其實就是Matlab裡的符號:或者...。而Range(a, b)其實就是Matlab中的a:b。有趣吧,注意a,b都需要是int型的哦,親。

Ptr類我就不太敢介紹了,是智慧指標,我也沒有用過,文件裡說是很類似大名鼎鼎的Boost庫裡的shared_ptr。希望以後有機會用一下再拿出來分享心得。

最後出場的還是最重量級的Mat,介紹幾個比較重要的成員變數flag(就是我之前說過的header裡的結構資訊,深度資訊,通道數),dims是Mat的維數,要求大於等於2,rows和cols引數代表2維矩陣的行數列數(對於更高維的矩陣,這兩個引數都是-1),還有個比較常用的引數應該uchar* data,是Mat的資料指標(比較暴力的同學可以直接呼叫它好了,不推薦),還有個引數refconst,我理解應該就是我上一講提到的釋放記憶體的時候要判斷這個矩陣是否是最後一個被使用的,這個引數應該就是控制跟當前矩陣結構相關的個數的。