日韩性视频-久久久蜜桃-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)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 毛片99 | 国产成人av一区二区三区在线观看 | 久久久国产精品久久久 | 亚洲av无码一区东京热久久 | 一区二区三区 中文字幕 | 天天艹夜夜艹 | 伊人资源网 | 成人黄色免费观看 | 91视频直接看| 亚洲黄色视屏 | 艳妇臀荡乳欲伦交换gif | 亚洲人成人网 | 国产高清自拍一区 | 激情文学欧美 | 日本欧美成人 | 日韩精品自拍偷拍 | 伊人老司机 | 美女一区二区三区视频 | 三级免费黄录像 | 播放灌醉水嫩大学生国内精品 | 中国美女囗交视频 | 欧洲三级视频 | 黑人玩弄人妻一区二区三区免费看 | 成人黄色激情视频 | 国产日韩一区二区三免费高清 | 乱一色一乱一性一视频 | 美痴女~美人上司北岛玲 | 一本久久a精品一合区久久久 | 无码人妻精品一区二区三区温州 | 在线免费中文字幕 | 国产在线欧美 | 精品人妻无码一区二区三区换脸 | 一区二区三区精品国产 | 美人被强行糟蹋np各种play | 日本三级中文字幕 | 99久久精品免费视频 | 爱情岛论坛亚洲品质自拍视频 | www.色在线| 97人妻一区二区精品免费视频 | 免费在线播放黄色片 | 中文字幕亚洲乱码熟女1区2区 | 永久免费未满蜜桃 | 亚洲欧美激情另类 | 五月婷婷激情在线 | 337p亚洲精品色噜噜噜 | 天天操天天射天天 | 18p在线观看 | 手机在线成人 | 久久国产精品影视 | 国产精伦 | 99热国内精品| 一级黄色片在线看 | 青青草原国产在线 | 成人黄色一级视频 | 伊人五月天 | 成人自拍视频在线观看 | 一本久道久久综合 | 少妇户外露出[11p] | 男女男精品视频网站 | 国产99久久九九精品无码免费 | 观看av免费 | 献给魔王伊伏洛基亚吧动漫在线观看 | 国产一二| 老司机午夜剧场 | 日本三级视频网站 | a级小视频 | 无码aⅴ精品一区二区三区浪潮 | 亚洲高清视频在线观看 | 日本精品三级 | 欧美成人专区 | 成人两性视频 | 蜜桃臀aⅴ精品一区二区三区 | 四色成人 | 51啪影院 | 免费成人黄 | 无码 制服 丝袜 国产 另类 | 成人夜视频 | 欧美激情一区二区三级高清视频 | 国产欧美日韩 | 91精品毛片| 国模大胆一区二区三区 | 日韩精品久久一区 | 99热日本 | 国产精品高潮呻吟av | 永久毛片 | 不卡av免费 | 浪漫樱花动漫在线观看免费 | 久久69| 日韩在线一级 | 超碰人人做 | 黄瓜视频污在线观看 | 一区二区三区四区在线视频 | 亚洲少妇网站 | 日本a级大片 | 国产精品毛片久久 | 国产免费脚交足视频在线观看 | 免费视频二区 | av片免费播放 | 欧美人成在线视频 |