OpenCV 笔记(09)— 常用的数据结构和函数(Vec、Point、Scalar、Size、Rect、cvtColor)
1. Vec 對象類型
Vec 是一個主要用于數值向量的模板類。我們可以定義向量的類型和組件的數量:
Vec<double, 19> myVector
我們還可以使用任何的預定義類型:
typedef Vec<uchar, 2> Vec2b;
typedef Vec<uchar, 3> Vec3b;
typedef Vec<uchar, 4> Vec4b;typedef Vec<short, 2> Vec2s;
typedef Vec<short, 3> Vec3s;
typedef Vec<short, 4> Vec4s;typedef Vec<int, 2> Vec2i;
typedef Vec<int, 3> Vec3i;
typedef Vec<int, 4> Vec4i;typedef Vec<float, 2> Vec2f;
typedef Vec<float, 3> Vec3f;
typedef Vec<float, 4> Vec4f;
typedef Vec<float, 6> Vec6f;typedef Vec<double, 2> Vec2d;
typedef Vec<double, 3> Vec3d;
typedef Vec<double, 4> Vec4d;
typedef Vec<double, 6> Vec6d;
實現了以下所有向量操作:
v1 = v2 + v3
v1 = v2 - v3
v1 = v2 * scale
v1 = scale * v2
v1 = -v2
v1 += v2
v1 == v2
v1 != v2
2. 點的表示 Point 類
Point 類數據結構表示了二維坐標系下的點,即由其圖像坐標 x 和 y 指定的 2D 點。用法如下:
Point point;
point.x = 10;
point.y = 8;
或者
Point point = Point(10, 8 );
另外, 與 Vec 類一樣, OpenCV 為方便起見定義了以下 Point 別名:
typedef Point_<int> Point2i;
typedef Point2i Point;
typedef Point_<float> Point2f;
typedef Point_<double> Point2d;
所以, Point_<int> 、 Point2i 、 Point 互相等價,Point_<float>、 Point2f 互相等價。
同樣的,就像 Point 一樣, Point3 模板類用于指定 3D 點。
OpenCV 為 Point 定義了以下運算符:
pt1 = pt2 + pt3;
pt1 = pt2 - pt3;
pt1 = pt2 * a;
pt1 = a * pt2;
pt1 = pt2 / a;
pt1 += pt2;
pt1 -= pt2;
pt1 *= pt2;
pt1 /= pt2;
double value = norm(pt);
pt1 == pt2;
pt1 != pt2;
3. 顏色的表示 Scalar 類
Scalar 對象類型是從 Vec 派生的模板類,有四個元素。
Scalar 表示具有 4 個元素的數組,在 OpenCV 中被大量用于傳遞和讀取像素值,如 RGB 顏色值。而 RGB 顏色值為三個參數,其實對于 Scalar 函數來說, 如果用不到第四個參數, 則不需要寫出來;若只寫三個參數, OpenCV 會認為我們就想表示三個參數。
來看個例子。如果給出以下顏色參數表達式:
Scalar(b, g, r)
b表示藍色g表示綠色r表示紅色
Scalar 類的源頭為 Scalar_ 類,而 Scalar_ 類是 Vec4x 的一個變種,我們常用的 Scalar 其實就是 Scalar_<double> 。這就解釋了為什么很多函數的參數輸入可以是 Mat ,也可以是 Scalar 。
要訪問 Vec 和 Scalar 值,可以使用 [] 運算符,其初始化可以用傳值的方式通過設置另一個標量、向量或值來完成,如下例所示:
Scalar s0(0);
Scalar s1(0.0, 1.0, 2.0, 3.0);
Scalar s2(s1);
4. 尺寸的表示 Size 類
OpenCV 中對 Size 類源代碼有以下定義,用于指定圖像或矩形大小。這個類添加了兩個成員 width 和 height ,以及有用的 area() 函數。
typedef Size_<int> Size2i;
typedef Size2i Size;
其中, Size_ 是個模板類,在這里 Size_<int> 表示其類體內部的模板所代表的類型為 int 。那這兩句代碼的意思,就是首先給已知的數據類型 Size_<int> 起個新名字, 叫 Size2i 。然后又給已知的數據類型 Size2i 起個新名字,叫 Size 。所以,連起來就是, Size_<int> 、 Size2i 、 Size 這三個類型名等價。
我們可以用 X.width 和 X.height 來分別表示其寬度和高度。
Size s = Size(3, 4);cout << "s.width is " << s.width << endl; // s.width is 3cout << "s.height is " << s.height << endl; // s.height is 4
area 用法:
Size s(10, 10);Mat img = Mat::zeros(s, CV_8UC1);s.width = 20;int area = s.area();cout << "area is " << area << endl; // area is 200
5. 矩形的表示 Rect 類
Rect 類的成員變量有 x 、 y 、 width 、 height , 分別為左上角點的坐標和矩形的寬和高。常用的成員函數有:
Size()返回值為Size;area()返回矩形的面積;contains(Point)判斷點是否在矩形內;inside(Rect)函數判斷矩形是否在該矩形內;tl()返回左上角點坐標;br()返回右下角點坐標。
值得注意的是,如果想求兩個矩形的交集和并集, 可以用如下格式:
Rect rect = recti & rect 2;
Rect rect = recti | rect 2;
如果想讓矩形進行平移操作和縮放操作, 甚至可以這樣寫:
Rect rectShift = rect + point;
Rect rectScale = rect + size;
Rect 模板類可用于定義圖像的感興趣區域( Region of Interest ,簡稱 ROI ),如下所示:
Mat img = imread("demo.jpg");Rect r(0, 0, 100, 100);Mat img_roi = img(r);
6. 顏色空間轉換 cvtColor 函數
cvtColor() 函數是 OpenCV 里的顏色空間轉換函數, 可以實現 RGB 顏色向HSV 、 HSI 等顏色空間的轉換,也可以轉換為灰度圖像。原型如下:
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0)
第一個參數為輸入圖像,第二個參數為輸出圖像,第三個參數為顏色空間轉換的標識符,第四個參數為目標圖像的通道數,若該參數是 0,表示目標圖像取源圖像的通道數。下面是一個調用示例:
/ /此句代碼的 OpenCV2 版為:
cvtColor(srclmage, dstImage, CV_GRAY2BGR) ; // 轉換原始圖為灰度圖
/ /此句代碼的 OpenCV3 版為:
cvtColor(srclmage, dstlmage, C0L0R_GRAY2BGR) ; // 轉換原始圖為灰度圖
即對于顏色空間轉換, OpenCV2 的 CV_ 前綴的宏命名規范,被 OpenCV3 中 COLOR_ 式的宏命名前綴所取代。另外,在這里需要再次提醒大家的是, OpenCV 默認的圖片通道存儲順序是 BGR , 即藍綠紅,而不是 RGB 。
7. 其它常用知識點
Matx是個輕量級的Mat,必須在使用前規定好大小,比如一個 2*3 的float型的Matx, 可以聲明為Matx23fVec是Matx的一個派生類,是一個一維的Matx,跟vector很相似。在OpenCV源碼中有如下定義。
template<typename_Tp, int n> class Vec : public Matx<_Tp, n, 1> { ... };
typedef Vec<uchar, 2> Vec2b;
Range類其實就是為了使OpenCV的使用更像MATLAB而產生的。比如Range::all()其實就是MATLAB里的符號。而Range(a,b)其實就是MATLAB中的a:b,注意這里的 a 和 b 都應為整型。OpenCV中防止內存溢出的函數有alignPtr、alignSize、allocate、deallocate、fastMalloc、fastFree等。<math.h>里的一些函數使用起來很方便:
- 有計算向量角度的函數
fastAtan2、 - 計算立方根的函數
cubeRoot、 - 向上取整函數
cvCeil、 - 向下取整函數
cvFloor、 - 四舍五入函數
cvRound等。
還有一些類似 MATLAB 里面的函數,比如 cvlslnf 判斷自變量是否無窮大, cvIsNaN 判斷自變量是否不是一個數。
- 顯示文字相關的函數有
getTextSize、cvInitFont、putText - 作圖相關的函數有
circle、clipLine、ellipse、ellipse2Poly、line、rectangle、polylines、類Linelterator。 - 填充相關的函數有
fillConvexPoly、fillPoly。 OpenCV中RNG()函數的作用為初始化隨機數狀態的生成器。
總結
以上是生活随笔為你收集整理的OpenCV 笔记(09)— 常用的数据结构和函数(Vec、Point、Scalar、Size、Rect、cvtColor)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022-2028年中国水性密封胶行业市
- 下一篇: 2022-2028年中国塑料导爆管行业市