一、(像素)點(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