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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV的数据类型——基础数据类型

發布時間:2024/7/23 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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類。

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>)中繼承而來,所以繼承了所有向量代數操作、成員訪問函數(比如[]操作符)和一些固定向量類的特性,如:其元素是通過整數下標來訪問的。

Scalar類直接支持的操作操作示例
默認構造函數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,其中前兩個都表示整型,最后一個表示單精度浮點型。

Size類直接支持的操作操作示例
默認構造函數

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(代表矩形的大小),但并非從它們繼承過來。

Rect類直接支持的操作操作示例
默認構造函數

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 );
Rect對象的覆寫操作符操作示例
矩形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的容器(表示圖形繞中心點的旋轉角度)。

RotatedRect類直接支持的操作操作示例
默認構造函數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::Matx類支持的操作操作示例
默認構造函數

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 );

?

method:矩陣分解類型名稱描述
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::Vec類支持的操作操作示例
默認構造函數

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的数据类型——基础数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。

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