日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

OpenCV 笔记(09)— 常用的数据结构和函数(Vec、Point、Scalar、Size、Rect、cvtColor)

發布時間:2023/11/28 生活经验 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 類數據結構表示了二維坐標系下的點,即由其圖像坐標 xy 指定的 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>Point2iPoint 互相等價,Point_<float>Point2f 互相等價。

同樣的,就像 Point 一樣, Point3 模板類用于指定 3D 點。

OpenCVPoint 定義了以下運算符:

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

要訪問 VecScalar 值,可以使用 [] 運算符,其初始化可以用傳值的方式通過設置另一個標量、向量或值來完成,如下例所示:

Scalar s0(0);
Scalar s1(0.0, 1.0, 2.0, 3.0);
Scalar s2(s1);

4. 尺寸的表示 Size 類

OpenCV 中對 Size 類源代碼有以下定義,用于指定圖像或矩形大小。這個類添加了兩個成員 widthheight ,以及有用的 area() 函數。

typedef Size_<int> Size2i;
typedef Size2i Size;

其中, Size_ 是個模板類,在這里 Size_<int> 表示其類體內部的模板所代表的類型為 int 。那這兩句代碼的意思,就是首先給已知的數據類型 Size_<int> 起個新名字, 叫 Size2i 。然后又給已知的數據類型 Size2i 起個新名字,叫 Size 。所以,連起來就是, Size_<int>Size2iSize 這三個類型名等價。

我們可以用 X.widthX.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 類的成員變量有 xywidthheight , 分別為左上角點的坐標和矩形的寬和高。常用的成員函數有:

  • 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 顏色向HSVHSI 等顏色空間的轉換,也可以轉換為灰度圖像。原型如下:

void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0)

第一個參數為輸入圖像,第二個參數為輸出圖像,第三個參數為顏色空間轉換的標識符,第四個參數為目標圖像的通道數,若該參數是 0,表示目標圖像取源圖像的通道數。下面是一個調用示例:

/ /此句代碼的 OpenCV2 版為:
cvtColor(srclmage, dstImage, CV_GRAY2BGR) ; // 轉換原始圖為灰度圖
/ /此句代碼的 OpenCV3 版為:
cvtColor(srclmage, dstlmage, C0L0R_GRAY2BGR) ; // 轉換原始圖為灰度圖

即對于顏色空間轉換, OpenCV2CV_ 前綴的宏命名規范,被 OpenCV3COLOR_ 式的宏命名前綴所取代。另外,在這里需要再次提醒大家的是, OpenCV 默認的圖片通道存儲順序是 BGR , 即藍綠紅,而不是 RGB

7. 其它常用知識點

  • Matx 是個輕量級的 Mat ,必須在使用前規定好大小,比如一個 2*3 的 float 型的 Matx , 可以聲明為 Matx23f
  • VecMatx 的一個派生類,是一個一維的 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 中防止內存溢出的函數有 alignPtralignSizeallocatedeallocatefastMallocfastFree 等。
  • <math.h> 里的一些函數使用起來很方便:
  1. 有計算向量角度的函數 fastAtan2
  2. 計算立方根的函數 cubeRoot
  3. 向上取整函數 cvCeil
  4. 向下取整函數 cvFloor
  5. 四舍五入函數 cvRound 等。

還有一些類似 MATLAB 里面的函數,比如 cvlslnf 判斷自變量是否無窮大, cvIsNaN 判斷自變量是否不是一個數。

  • 顯示文字相關的函數有 getTextSizecvInitFontputText
  • 作圖相關的函數有 circleclipLineellipseellipse2Polylinerectanglepolylines 、類 Linelterator
  • 填充相關的函數有 fillConvexPolyfillPoly
  • OpenCVRNG() 函數的作用為初始化隨機數狀態的生成器。

總結

以上是生活随笔為你收集整理的OpenCV 笔记(09)— 常用的数据结构和函数(Vec、Point、Scalar、Size、Rect、cvtColor)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。