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,我理解應該就是我上一講提到的釋放內存的時候要判斷這個矩陣是否是最後一個被使用的,這個參數應該就是控制跟當前矩陣結構相關的個數的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章