OpenCV的数据类型——基础数据类型
OpenCV有很多數據類型,從組織結構的角度來看,OpenCV的基礎類型類型主要分為三類。第一類是直接從C++原語中繼承的基礎數據類型;第二類是輔助對象;第三類是大型數據類型。本文主要介紹OpenCV的基礎數據類型。
目錄
Point類
Scalar類
Size類
Rect類
RotatedRect類
固定矩陣類
固定向量類
復數類
Point類
cv::Point類是兩到三個原語類型的容器,其成員是通過變量名稱x、y、z訪問的,而不是通過下標訪問。Point類是通過自己的模板派生來的,這是一個基礎模板;實際上由兩個這樣的模板,分別是給二維、三維的點提供的。這些類的實例有cv::Point2i、cv::Point2f、cv::Point2d或cv::Point3i、cv::Point3f、cv::Point3d(在這里,最后一個字母表示構造該點所需要的原語,i是一個32位整形,f是一個32位浮點數,d是一個64位浮點數,還可以有無符號字符b和短整型s)。
優勢:簡單且開銷小。Point類可以轉換成固定向量類或固定矩陣類,同樣也可由它們轉換得到Point類。
| 默認構造函數 | cv::Point2i p2; cv::Point3i p3; |
| 復制構造函數 | cv::Point3i?p1( p );? ? 注:若p為浮點型,則會自動取整 |
| 值構造函數 | cv::Point2i( x0, x1 ); cv::Point3d( x0, x1, x2 ); |
| 構造成固定向量類 | (cv::Vec3f) p; |
| 成員訪問 | p.x, p.y, p.z |
| 點乘 | float x = p1.dot( p ); |
| 雙精度點乘 | double?x = p1.dot( p ); |
| 叉乘 | p1.cross( p );? ?注:只用于三維的點 |
| 判斷一個點p是否在矩形r內 | p1.inside( r );? ?注:只用于二維的點 |
Scalar類
cv::Scalar是四維點類,是四維雙精度向量的快速表示。cv::Scalar直接從固定向量類模板實例(cv::Vec<double, 4>)中繼承而來,所以繼承了所有向量代數操作、成員訪問函數(比如[]操作符)和一些固定向量類的特性,如:其元素是通過整數下標來訪問的。
| 默認構造函數 | cv::Scalar s; |
| 復制構造函數 | cv::Scalar s2( s1 ); |
| 值構造函數 | cv::Scalar s( x0 ); cv::Scalar s( x0, x1, x2, x3 ); |
| 元素相乘 | s1.mul( s2 ); |
| (四元數)共軛 | s.conj(); // return?cv::Scalar( x0, -x1, -x2, -x3 ); |
| (四元數)真值測試 | s.isReal(); // if x1 == x2 == x3 == 0{ return true; } |
Size類
Size類在實際操作時和Point類相似,可以進行互相轉換。主要區別在于Size類中對應的成員是width和height,而不是x和y,并且不支持轉換到固定向量類。Size類的別名有cv::Size、cv::Size2i和cv::Size2f,其中前兩個都表示整型,最后一個表示單精度浮點型。
| 默認構造函數 | cv::Size sz; cv::Size2i sz; cv::Size2f sz; |
| 復制構造函數 | cv::Size2f sz2( sz1 ); |
| 值構造函數 | cv::Size2f sz( w, h ); |
| 成員訪問 | sz.width; sz.height; |
| 計算面積 | sz.area(); |
Rect類
Rect類又稱矩形類,包含Point類的成員x和y(代表矩形左上角的坐標)和Size類的成員width和height(代表矩形的大小),但并非從它們繼承過來。
| 默認構造函數 | cv::Rect r; |
| 復制構造函數 | cv::Rect r2( r1 ); |
| 值構造函數 | cv::Rect( x, y, w, h ); |
| 由起始點和大小構造 | cv::Rect( p,? sz ); |
| 由兩個對角構造 | cv::Rect( p1, p2 ); |
| 成員訪問 | r.x; r.y; r.width; r.height; |
| 計算面積 | r.area(); |
| 提取左上角 | r.tl();? ? // top-left |
| 提取右下角 | r.br();? ?// bottom-left |
| 判斷點p是否在矩形r內 | r.contains( p ); |
| 矩形r1和矩形r2的交集 | cv::Rect r3 = r1 & r2; r1 &= r2; |
| 同時包含矩形r1和矩形r2的最小面積矩形 | cv::Rect r3 = r1 | r2; r1 |= r2; |
| 平移矩形r x個數量 | cv::Rect rx = r + x; r?+= x;? ? // x為一個Point實例,左上角偏移量 |
| 擴大矩形r s大小 | cv::Rect rs = r + s; r?+= s;? ? // s為一個Size實例,尺寸改變量 |
| 比較矩形r1和矩形r2是否相等 | bool eq = ( r1 == r2 ); |
| 比較矩形r1和矩形r2是否不相等 | bool ne = ( r1 != r2 ); |
RotatedRect類
cv::RotatedRect類是OpenCV中少數底層沒有使用模板的C++接口之一。它是一個包含一個中心點cv::Point2f、一個大小cv::Size2f和一個額外的角度float的容器(表示圖形繞中心點的旋轉角度)。
| 默認構造函數 | cv::RotatedRect rr(); |
| 復制構造函數 | cv::RotatedRect rr2( rr1 ); |
| 值構造函數,需要一個點(point)、 一個大小(size)和一個角度(angle) | cv::RotatedRect rr( p, sz, theta ); |
| 成員訪問 | rr.center; rr.size; rr.angle; |
| 返回四個角的列表 | rr.points( pts[4] ); |
| 包含旋轉矩形的最小矩形 | rr.boundingRect(); |
固定矩陣類
固定矩陣類cv::Matx<>的維度在編譯之前必須知道,因此被稱為“固定”。它們內部的所有數據都是在堆棧上分配的,所以分配和消除的很快,消除了許多動態內存分配操作,運行效率高。cv::Matx<>一般都以別名cv::Matx{1,2,3,4,5,6}{1,2,3,4,5,6}{f,d}的形式應用,適用于小型矩陣,并做了特別的優化。
| 默認構造函數 | cv::Matx33f m33f; cv::Matx43d m43d; |
| 復制構造函數 | cv::Matx22d m22d( n22d ); |
| 值構造函數 | cv::Matx21f m( x0, x1); cv::Matx44d m( x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 ); |
| 函相同元素的矩陣 | m33f =?cv::Matx33f::all( x ); |
| 全0矩陣 | m23d =?cv::Matx23d::zeros(); |
| 全1矩陣 | m16f =?cv::Matx16f::ones(); |
| 創建一個單位矩陣 | m33f =?cv::Matx33f::eye(); |
| 創建一個可以容納另一個矩陣對角線的矩陣 | m31f =?cv::Matx31f::diag(); |
| 創建一個均勻分布的矩陣 | m33f =?cv::Matx33f::randu( min, max ); |
| 創建一個正態分布的矩陣 | m33f =?cv::Matx33f::nrandn( mean, variance ); |
| 成員訪問 | m( i, j); m( i ); |
| 矩陣代數運算 | m1 = m0;? m0 * m1;? m0 + m1;? m0 - m1; |
| 單例(singleton)代數 | m * a;? a * m;? m / a; |
| 比較 | m1 == m2;? m1 != m2; |
| 點積 | m1.dot( m2 );? ? ? // 使用默認精度運算法求點積 |
| 點積 | m1.ddot( m2 );? ? // 使用雙精度運算法求點積 |
| 改變矩陣形狀 | m91f = m33f.reshape<9, 1>(); |
| 變換操作符 | m44f = (Mat44f) m44d; |
| 提取(i, j)處的2×2子矩陣 | m44f.get_minor<2, 2>( i, j ); |
| 提取第 i 行 | m14f = m44f.row( i ); |
| 提取第 j 列 | m41f = m44f.col( j ); |
| 提取矩陣對角線 | m41f = m44f.diag(); |
| 計算轉置 | n44f = m44f.t(); |
| 逆矩陣 | n44f = m44f.inv( method );? ? // method為矩陣分解類型,默認為cv::DECOMP_LU |
| 解線性系統 | m31f = m33f.solve( rhs31f, method); m32f = m33f.solve<2>( rhs32f, method); |
| 每個元素的乘法 | m1.mul( m2 ); |
?
| DECOMP_LU | Gaussian elimination with the optimal pivot element chosen. 選擇了最優主元的高斯消去法。一定不能是單數的。 |
| DECOMP_SVD? | singular value decomposition (SVD) method; the system can be over-defined and/or the matrix src1 can be singular 奇異值分解(SVD)方法;系統可以被過度定義和/或者矩陣src1可以是單數。 |
| DECOMP_EIG | eigenvalue decomposition; the matrix src1 must be symmetrical 特征值分解;矩陣src1必須是對稱的。 |
| DECOMP_CHOLESKY | Cholesky??factorization; the matrix src1 must be symmetrical and positively defined 柯列斯基分解;矩陣src1必須是對稱的并是正定矩陣。該類型在處理大的矩陣時的速度是LU的兩倍左右。 |
| DECOMP_QR? | QR factorization; the system can be over-defined and/or the matrix src1 can be singular QR分解;系統可以被過度定義和/或者矩陣src1可以是單數。 |
| DECOMP_NORMAL? | while all the previous flags are mutually exclusive, this flag can be used together with any of the previous; it means that the normal equations??are solved instead of the original system? 雖然前面所有的標志都是互斥的,但是這個標志可以和前面的任何一個一起使用;這意味著解的是正規方程而不是原來的方程。 |
固定向量類
固定向量類cv::Vec是從固定矩陣類派生出來的,從C++繼承的意義上,可以說固定向量模板cv::Vec是列為1的cv::Matx<>。其特例的形式為cv::Vec{2,3,4,6}{b,s,w,i,f,d}(w是無符號短整型),主要遍歷方式是通過單個數索引各項。
| 默認構造函數 | cv::Vec2s v2s; cv::Vec6f v6f; |
| 復制構造函數 | cv::Vec3f u3f( v3f ); |
| 值構造函數 | cv::Vec2f v2f( x0,? x1); cv::Vec6d v6d( x0, x1, x2, x3, x4, x5 ); |
| 成員訪問 | v4f[ i ];? v3w( j ); |
| 向量叉乘 | v3f.cross( u3f ); |
復數類
cv::Complexf和cv::Complexd分別是單精度和雙精度復數的別名。
| 默認構造函數 | cv::Complexf z1; cv::Complexd z2; |
| 復制構造函數 | cv::Complexf z2( z1); |
| 值構造函數 | cv::Complexf z1( re0); cv::Complexf z2( re0, im1); |
| 成員訪問 | z1.re; z1.im1; |
| 復共軛 | z2 = z1.conj(); |
?
總結
以上是生活随笔為你收集整理的OpenCV的数据类型——基础数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaSE——XML与JSON(语法格
- 下一篇: **Java有哪些悲观锁的实现_「Jav