OpenCV基礎類型


一、(像素)點(x,y)類型

1.1 C語言 CvPoint結構體

CvPoint 類型是一個包含兩個int類型的結構體;通常表示某像素點的坐標位置(x,y)

兩個變體類型:

CvPoint2D32f表示該點坐標(x,y)的數據類型時浮點型;

CvPoint3D32f表示該點坐標(x,y,z)的數據類型時浮點型;

1.2 C++語言  Point類

通過模板結構實現,重載了向量vector類代數操作和組合操作

針對二維和三維存在兩種模板結構體Point,數據類型可以為int 或者 float等等

點類型最大的好處是簡單開銷小,我們很少對點類型數據進行數據操作,而是用於轉換為更多其他的結構類型,例如向量類或者矩陣類;

點類型聲明:Point+維度+類型

1 b- unsigned char
2 s- short int
3 i- 32-bit int
4 f- 32-bit float
5 d- 64-bit float
類型表示

Point類的操作:

 1 默認構造    Point2i p1;Point3f p2;
 2 拷貝構造    Point3f p2(p1);
 3 數值初始化  Point2i p1(x0,x1);Point3f p2(x0,x1,x2);
 4 轉換到Vector類型  (Vec3f) p;
 5 成員訪問   p.x; p.y;
 6 點積運算   float x = p1.dot(p2);
 7 雙精度點積 double x = p1.ddot(p2);
 8 向量積(僅適用三維)     p1.cross(p2);
 9 查詢是否在某區域(rectangle)內(僅適用二維)     p.inside(r);
10 注意: C++Point類轉換成C語言結構CvPoint需要注意浮點型數據直接轉換為CvPoint會自動四舍五入(CvPoint默認類型為int); 

二、(圖像)大小類型CvSize

2.1 C語言 CvSize結構體

CvSize 類型是一個包含兩個int類型的結構體;通常表示某圖像/區域的寬高大小(width, height)

數據類型使用浮點型,同樣顯示指定CVSize2D32f

2.2 C++語言  Size類

相比Point類,

1.數據成員不同,Size類成員為width 和 height

2.不能轉換成固定大小的Vector類,但Vector類和Point類可以轉換成Size類

Size類存在三種別名 Size == Size2i、Size2f

Size類操作

1 默認構造   Size sz;Size2i sz; Size2f p2;
2 拷貝構造   Size sz2(sz1);
3 數值初始化   Size sz(w,h);
4 成員訪問   sz.width; sz.height;
5 計算區域面積   sz.area();

三、區域矩形大小類型CvRect

3.1 C語言 CvRect結構體

CvRect派生於CvPoint和CvSize,包含四個int成員:x,y,width,height;

3.2 C++語言 Rect結構體

矩形類成員包含Point類成員的x,y表示矩形的左上角,Size類成員width和height表示矩形的大小,Rect類並不繼承自Point或Size;

Rect類操作

 1 默認構造   Rect r;
 2 拷貝構造   Rect r2(r1);
 3 數值初始化   Rect r(x, y, w , h);
 4 點坐標及大小初始化構造 Rect r(p,sz);
 5 兩點初始化構造 Rect r(p1, p2);
 6 成員訪問   r.x; r.y; r.width; r.height;
 7 計算區域面積 r.area();
 8 提取左上角點 r.tl();
 9 提取右下角點 r.br();
10 判斷點是否在某區域內  r.contains(p);
11 
12 重載操作符對象間的運算:
13 矩形1與矩形2的交集              Rect r3 = r1 & r2;
14 包含矩形1與矩形2的最小矩形   Rect r3 = r1 | r2;
15 平移左上角坐標矩形大小不變    Rect r2 = r1 + p;
16 放大或縮小矩形大小,左上角點不變 Rect r2 = r1 + sz;
17 判斷兩個矩形是否相等  bool eq = ( r1 == r2);bool ne = ( r1 != r2);

操作計算演示:

 1 #include <opencv2/core.hpp>
 2 #include <iostream>
 3  
 4 using namespace std;
 5 using namespace cv;
 6  
 7 int main()
 8 {
 9     Rect r1(5, 5, 15, 10);
10     Rect r2(5, 5, 10, 5);
11     Rect r3 = r1 | r2;
12     Point p(2,3);
13     Rect r4 = r1 + p;
14     cout << "r3.width = " << r3.width << endl    //15
15          << "r3.height= " << r3.height << endl   //10
16          << "r3.area  = " << r3.area() << endl;  //150
17     cout << r3 << endl;                          //[ 15 x 10 from (5, 5)]
18     cout << r4 << endl;
19     return 0;
20 }

四、圖像像素RGBA值CvScalar

4.1 C語言 CvScalar結構體

內部存儲了四個double型的值,分別為val[0],val[1],val[2],val[3],我們通常用的是前三個,val[0],val[1],val[2]的含義分別是彩色照片的三個通道BGR。R是紅色分量,G是綠色分量,B是藍色分量,a是alpha;

圖像存儲的矩陣大小依賴於色彩空間的選用,更准確的說取決於所使用的通道數,在灰度圖像中在內存描述如下:

對於多通道圖像,列包含與通道數量一樣多的子列。例如,在BGR顏色系統的情況下:

來自:https://docs.opencv.org/master/db/da5/tutorial_how_to_scan_images.html

4.2 C++語言  Scalar類

Scalar類直接繼承固定大小的向量Vector類,直接支持向量類的代數操作,成員訪問及其它操作特性;

Scalar類的操作:

1 默認構造      Scalar s;
2 拷貝構造      Scalar s2(s1);
3 數值初始化    Scalar s(x0); Scalar s(x0,x1,x2,s3);
4 數組元素相乘  s1.mul(s2);
5 共軛             s1.conj();

五、補充部分

5.1 旋轉矩形類 RotatedRect類

在OpenCV C++借口中少數不使用類模板實現的類型之一

相比Rect類,該類將Point2f稱為中心點,Size2f稱為大小,另外一個附加的float稱為角度(表現為圍繞中心點順時針方向旋轉的角度)

RotatedRect類操作

1 默認構造     RotatedRect rr();
2 拷貝構造     RotatedRect rr2(rr1);
3 數值初始化   RotatedRect rr(p,sz,theta);
4 兩點初始化   RotatedRect rr(p1,p2);
5 成員訪問     rr.center; rr.size; rr.angle;
6 返回4角點坐標 rr.points(pts[4]);

5.2固定大小矩陣類 fixed matx類

fixed matx類是針對在編譯期間已知其維度的且通常處理矩陣代數運算,在棧上分配空間

與其他類型的關系:

matx是其他基礎類型的核心;

例如:fixed vector繼承自fixed matrix;其它類(如Scalar類)繼承自fixed vector,或者針對許多重要操作,它們都依賴於轉換成fixed vector;

如果對象確實是一個大型陣列,比如圖像或一組大型點陣列應該使用Mat類;

Matx類操作

 1 默認構造  Matx33f m33f; Matx43d m43d;
 2 拷貝構造  Matx22d m22d(n22d);
 3 數值初始化 Matx21f m(x0,x1); Matx44d m(x0,x1,x2,x3...x15);
 4 全指定元素 m33f = Matx33f::all(x);
 5 零矩陣     m23d = Matx23d::zeros();
 6 一矩陣     m16f = Matx16f::ones();
 7 單位矩陣   m33f = Matx33f::eye();
 8 均勻分布矩陣 m33f = Matx33f::randu(min, max);
 9 正態分布矩陣 m33f = Matx33f::nrandu(mean, variance);
10 成員訪問  m(i,j), m(i)一個參數僅限於一維矩陣
11 矩陣代數運算 m1 = m0; m0*m1; m0 + m1; m0-m1;
12 數乘運算  m*a;a*m;m/a;

5.3固定大小向量類 fixed vector類

繼承自fixed matrix類,可以看做matx類列數為一的別名;

該類的設計,便利性在於單順序范文成員,並定義一些通常mat

聲明:Vec{2,3,4,6}{b,s,w,i,f,d}

W- unsigned short

fixed Vector類操作

1 默認構造   Vec2s v2s;
2 拷貝構造   Vec3f u3f(v3f);
3 數值初始化 Vec2f v2f(x0,x1);
4 成員訪問   v4f(i), v3w[i] 兩種操作符都可以
5 向量積    v3f.cross(u3f);

 

Written at : 2018.06.23


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM