1. 程式人生 > >Opencv矩陣操作copyTo convertTo clone reshape

Opencv矩陣操作copyTo convertTo clone reshape

<div id="article_content" class="article_content clearfix csdn-tracking-statistics" data-pid="blog"  data-mod=popu_307  data-dsm = "post" >
							<div class="article-copyright">
				版權宣告:本文為博主原創文章,未經博主允許不得轉載。					https://blog.csdn.net/qq_20823641/article/details/51939698				</div>
							            <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f76675cdea.css" />
					<div class="htmledit_views">

矩陣操作(拷貝、洗牌、區域性訪問):

(1)src.copyTo(dst)

把src矩陣中的資料拷貝到dst。

(2)src.convertTo(dst,type, scale, shift)

  • 縮放並轉換到另外一種資料型別:
  • dst:目的矩陣
  • type:需要的輸出矩陣型別,或者更明確的,是輸出矩陣的深度,如果是負值(常用-1)則輸出矩陣和輸入矩陣型別相同
  • scale和shift:縮放參數,也可以寫為alpha和beta
  • 這個命令也等價於下面的轉換公式:
  • m(x,y) =saturate_cast(α(*this)(x,y)+β)

(3)m.clone()

深度拷貝(啥意思?看《C++Primer》吧)

(4)m.reshape(nch,nrows)

重設矩陣的通道數和行數,不拷貝資料。

  • nch:新的通道數,若為0則不變
  • nrows:新的行數,若為0則不變

(5)m.row(i),m.col(i)

建立一個矩陣頭,指向m矩陣的第i行/列,O(1)複雜度,不拷貝資料,新的矩陣頭所代表的矩陣和m矩陣的第i行/列共享資料。

(6)m.rowRange(Range(i1,i2))

m.colRange(Range(j1,j2))

建立一個矩陣頭,指向m矩陣的第i1到i2行或者第j1到j2列,O(1)複雜度,不拷貝資料。

(7)m.diag(i)

建立一個矩陣頭,指向m矩陣的對角線,生成的是一個單列矩陣,O(1)複雜度,不拷貝資料。i=0時表示主對角線,i>0表示下半邊的對角線,i<0表示上半邊的對角線。

(8)m(Range(i1,i2),Range(j1,j2))

從矩陣m中的第i1行到第i2行以及第j1列到第j2列所劃定的範圍提取一個小矩陣。

(9)m.repeat(ny,nx)

把m矩陣貼馬賽克,獲取一個大矩陣,在y方向上重複ny次,在x方向上重複nx次。

(10)flip(src,dst,dir)

翻轉矩陣,dir是翻轉方向,0表示沿x軸翻轉,1表示沿y軸翻轉,-1表示沿x軸和y軸都進行翻轉。

(11)split(...)

把一個多通道矩陣分解為幾個單通道矩陣,操作RGB影象之類的最常用了。

(12)merge(...)

和上面的操作相反。

(13)mixChannels(...)

上面兩個函式的一般形式。

(14)randShuffle(...)

把矩陣中的元素隨機重排

示例1:
Mat imgroi =image(Rect(10, 20, 100, 100));
GaussianBlur(imgroi,imgroi, Size(5, 5), 1.2, 1.2);
第一句話取image的一個區域,第二句話對這個區域進行高斯平滑。

示例2:
m.row(i) +=m.row(j)*alpha;
m矩陣的第j行乘以alpha後加到第i行中。
另外,在Mat::row的介紹中提到,在目前的實現中
A.row(i) =A.row(j);
這樣的語句是不行的,改成
A.row(i) =A.row(j) + 0;
或者這樣就可以了:
A.row(j).copyTo(A.row(i));

示例3:
Rect r(1, 1, 10,20);
Mat dstroi =dst(Rect(0,10,r.width,r.height));
src(r).convertTo(dstroi,dstroi.type(), 1, 0);
第一句定義一個矩形範圍,第二句從dst矩陣中扣出一個ROI區域,第三句把src矩陣中由r定義的範圍轉換到dstroi中。


簡單矩陣操作


add(),subtract(), multiply(), divide(), absdiff(), bitwiseand(), bitwiseor(),bitwisexor(), max(), min(), compare()

分別是加減乘除、按位與或異或、最大最小之類的。


sum(), mean(),meanStdDev(), norm(), countNonZero(), minMaxLoc()

求和、均值、均值方差、矩陣範數、非零個數、最大最小值。


exp(), log(),pow(), sqrt(), cartToPolar(), polarToCart()

指數、對數、乘方、開放、極座標轉換。


scaleAdd(),transpose(), gemm(), invert(), solve(), determinant(), trace(), eigen(), SVD

線性組合、轉置、廣義矩陣乘法、矩陣求逆、解線性系統或最小二乘問題、計算行列式、矩陣的跡、計算對稱矩陣的特徵值和特徵向量、奇異值分解


dft(), idft(),dct(), idct()

離散傅立葉變換、離散餘弦變換