opencv简单的矩阵操作
OpenCV的基本矩陣操作與示例
?
OpenCV中的矩陣操作非常重要,本文總結了矩陣的創(chuàng)建、初始化以及基本矩陣操作,給出了示例代碼,主要內(nèi)容包括:
?
- 創(chuàng)建與初始化
- 矩陣加減法
- 矩陣乘法
- 矩陣轉置
- 矩陣求逆
- 矩陣非零元素個數(shù)
- 矩陣均值與標準差
- 矩陣全局極值及位置
- 其他矩陣運算函數(shù)列表
?
?
?
1.?創(chuàng)建與初始化矩陣
?
1.1?數(shù)據(jù)類型
建立矩陣必須要指定矩陣存儲的數(shù)據(jù)類型,圖像處理中常用的幾種數(shù)據(jù)類型如下:
?
[cpp]?view plain?copy
?
包括數(shù)據(jù)位深度8位、32位,數(shù)據(jù)類型U:uchar、F:float型以及通道數(shù)C1:單通道、C3:三通道、C4:四通道。
?
1.2?基本方法
我們可以通過載入圖像來創(chuàng)建Mat類型矩陣,當然也可以直接手動創(chuàng)建矩陣,基本方法是指定矩陣尺寸和數(shù)據(jù)類型:
[cpp]?view plain?copy
運行結果:
3通道矩陣中,一個矩陣元素包含3個變量。
?
1.3?初始化方法
上述方法不初始化矩陣數(shù)據(jù),因此將出現(xiàn)隨機值。如果想避免這種情況,可使用Mat類的幾種初始化創(chuàng)建矩陣的方法:
?
[cpp]?view plain?copy
運行結果:
?
?
2.?矩陣運算
?
2.1?基本概念
?OpenCV的Mat類允許所有的矩陣運算。
?
2.2?矩陣加減法
我們可以使用"+"和"-"符號進行矩陣加減運算。
[cpp]?view plain?copy
?
?
?
?
2.3?矩陣乘法
使用"*"號計算矩陣與標量相乘,矩陣與矩陣相乘(必須滿足矩陣相乘的行列數(shù)對應規(guī)則)
?
[cpp]?view plain?copy
?
?
2.4?矩陣轉置
矩陣轉置是將矩陣的行與列順序對調(diào)(第i行轉變?yōu)榈趇列)形成一個新的矩陣。OpenCV通過Mat類的t()函數(shù)實現(xiàn)。
[cpp]?view plain?copy
運行結果:
?
?
?
2.5?求逆矩陣
逆矩陣在某些算法中經(jīng)常出現(xiàn),在OpenCV中通過Mat類的inv()方法實現(xiàn)
[cpp]?view plain?copy
運行結果:
?
單位矩陣的逆就是其本身。
?
?
2.6?計算矩陣非零元素個數(shù)
計算物體的像素或面積常需要用到計算矩陣中的非零元素個數(shù),OpenCV中使用countNonZero()函數(shù)實現(xiàn)。
?
?
[cpp]?view plain?copy
運行結果:
?
?
?
2.7?均值和標準差
OpenCV提供了矩陣均值和標準差計算功能,可以使用meanStdDev(src,mean,stddev)函數(shù)實現(xiàn)。
?
參數(shù)
?
?
- src?–?輸入矩陣或圖像
- mean?–?均值,OutputArray
- stddev?–?標準差,OutputArray
?
[cpp]?view plain?copy
運行結果:
需要說明的是,如果src是多通道圖像或多維矩陣,則函數(shù)分別計算不同通道的均值與標準差,因此返回值mean和stddev為對應維度的向量。
?
[cpp]?view plain?copy
多通道矩陣運算結果:
?
?
2.8?求最大最小值
求輸入矩陣的全局最大最小值及其位置,可使用函數(shù):
?
?
[cpp]?view plain?copy
?
參數(shù):
?
- src?– 輸入單通道矩陣(圖像).
- minVal?– 指向最小值的指針,?如果未指定則使用NULL
- maxVal?– 指向最大值的指針,?如果未指定則使用NULL
- minLoc?– 指向最小值位置(2維情況)的指針,?如果未指定則使用NULL
- maxLoc?– 指向最大值位置(2維情況)的指針,?如果未指定則使用NULL
- mask?– 可選的蒙版,用于選擇待處理子區(qū)域
?
[cpp]?view plain?copy
運行結果:
輸入圖像及其最大最小值位置
?
?
3.?其他矩陣運算
其他矩陣運算函數(shù)見下表:
?
?
| Function?(函數(shù)名) | Use?(函數(shù)用處) |
| add | 矩陣加法,A+B的更高級形式,支持mask |
| scaleAdd | 矩陣加法,一個帶有縮放因子dst(I)?=?scale?*?src1(I)?+?src2(I) |
| addWeighted | 矩陣加法,兩個帶有縮放因子dst(I)?=?saturate(src1(I)?*?alpha?+?src2(I)?*?beta?+?gamma) |
| subtract | 矩陣減法,A-B的更高級形式,支持mask |
| multiply | 矩陣逐元素乘法,同Mat::mul()函數(shù),與A*B區(qū)別,支持mask |
| gemm | 一個廣義的矩陣乘法操作 |
| divide | 矩陣逐元素除法,與A/B區(qū)別,支持mask |
| abs | 對每個元素求絕對值 |
| absdiff | 兩個矩陣的差的絕對值 |
| exp | 求每個矩陣元素?src(I)?的自然數(shù)?e?的?src(I)?次冪?dst[I]?=?esrc(I) |
| pow | 求每個矩陣元素?src(I)?的?p?次冪?dst[I]?=?src(I)p |
| log | 求每個矩陣元素的自然數(shù)底?dst[I]?=?log|src(I)|?(if?src?!=?0) |
| sqrt | 求每個矩陣元素的平方根 |
| min,?max | 求每個元素的最小值或最大值返回這個矩陣?dst(I)?=?min(src1(I),?src2(I)),?max同 |
| minMaxLoc | 定位矩陣中最小值、最大值的位置 |
| compare | 返回逐個元素比較結果的矩陣 |
| bitwise_and,?bitwise_not,?bitwise_or,?bitwise_xor | 每個元素進行位運算,分別是和、非、或、異或 |
| cvarrToMat | 舊版數(shù)據(jù)CvMat,IplImage,CvMatND轉換到新版數(shù)據(jù)Mat |
| extractImageCOI | 從舊版數(shù)據(jù)中提取指定的通道矩陣給新版數(shù)據(jù)Mat |
| randu | 以Uniform分布產(chǎn)生隨機數(shù)填充矩陣,同?RNG::fill(mat,?RNG::UNIFORM) |
| randn | 以Normal分布產(chǎn)生隨機數(shù)填充矩陣,同?RNG::fill(mat,?RNG::NORMAL) |
| randShuffle | 隨機打亂一個一維向量的元素順序 |
| theRNG() | 返回一個默認構造的RNG類的對象 ?theRNG()::fill(...) |
| reduce | 矩陣縮成向量 |
| repeat | 矩陣拷貝的時候指定按x/y方向重復 |
| split | 多通道矩陣分解成多個單通道矩陣 |
| merge | 多個單通道矩陣合成一個多通道矩陣 |
| mixChannels | 矩陣間通道拷貝,如Rgba[]到Rgb[]和Alpha[] |
| sort,?sortIdx | 為矩陣的每行或每列元素排序 |
| setIdentity | 設置單元矩陣 |
| completeSymm | 矩陣上下三角拷貝 |
| inRange | 檢查元素的取值范圍是否在另兩個矩陣的元素取值之間,返回驗證矩陣 |
| checkRange | 檢查矩陣的每個元素的取值是否在最小值與最大值之間,返回驗證結果bool |
| sum | 求矩陣的元素和 |
| mean | 求均值 |
| meanStdDev | 均值和標準差 |
| countNonZero | 統(tǒng)計非零值個數(shù) |
| cartToPolar,?polarToCart | 笛卡爾坐標與極坐標之間的轉換 |
| flip | 矩陣翻轉 |
| transpose | 矩陣轉置,比較?Mat::t()?AT |
| trace | 矩陣的跡 |
| determinant | 行列式?|A|,?det(A) |
| eigen | 矩陣的特征值和特征向量 |
| invert | 矩陣的逆或者偽逆,比較?Mat::inv() |
| magnitude | 向量長度計算?dst(I)?=?sqrt(x(I)2?+?y(I)2) |
| Mahalanobis | Mahalanobis距離計算 |
| phase | 相位計算,即兩個向量之間的夾角 |
| norm | 求范數(shù),1-范數(shù)、2-范數(shù)、無窮范數(shù) |
| normalize | 標準化 |
| mulTransposed | 矩陣和它自己的轉置相乘?AT?*?A,?dst?=?scale(src?-?delta)T(src?-?delta) |
| convertScaleAbs | 先縮放元素再取絕對值,最后轉換格式為8bit型 |
| calcCovarMatrix | 計算協(xié)方差陣 |
| solve | 求解1個或多個線性系統(tǒng)或者求解最小平方問題(least-squares?problem) |
| solveCubic | 求解三次方程的根 |
| solvePoly | 求解多項式的實根和重根 |
| dct,?idct | 正、逆離散余弦變換,idct同dct(src,?dst,?flags?|?DCT_INVERSE) |
| dft,?idft | 正、逆離散傅立葉變換,?idft同dft(src,?dst,?flags?|?DTF_INVERSE) |
| LUT | 查表變換 |
| getOptimalDFTSize | 返回一個優(yōu)化過的DFT大小 |
| mulSpecturms | 兩個傅立葉頻譜間逐元素的乘法 |
?
?
上表引自:http://blog.sina.com.cn/s/blog_7908e1290101i97z.html
?
轉載請注明出處(本文更新鏈接):http://blog.csdn.net/iracer/article/details/51296631
- 本文已收錄于以下專欄:
- Bin博士的機器視覺工作間
OpenCV的基本矩陣操作與示例
?
OpenCV中的矩陣操作非常重要,本文總結了矩陣的創(chuàng)建、初始化以及基本矩陣操作,給出了示例代碼,主要內(nèi)容包括:
?
- 創(chuàng)建與初始化
- 矩陣加減法
- 矩陣乘法
- 矩陣轉置
- 矩陣求逆
- 矩陣非零元素個數(shù)
- 矩陣均值與標準差
- 矩陣全局極值及位置
- 其他矩陣運算函數(shù)列表
?
?
?
1.?創(chuàng)建與初始化矩陣
?
1.1?數(shù)據(jù)類型
建立矩陣必須要指定矩陣存儲的數(shù)據(jù)類型,圖像處理中常用的幾種數(shù)據(jù)類型如下:
?
[cpp]?view plain?copy
?
包括數(shù)據(jù)位深度8位、32位,數(shù)據(jù)類型U:uchar、F:float型以及通道數(shù)C1:單通道、C3:三通道、C4:四通道。
?
1.2?基本方法
我們可以通過載入圖像來創(chuàng)建Mat類型矩陣,當然也可以直接手動創(chuàng)建矩陣,基本方法是指定矩陣尺寸和數(shù)據(jù)類型:
[cpp]?view plain?copy
運行結果:
3通道矩陣中,一個矩陣元素包含3個變量。
?
1.3?初始化方法
上述方法不初始化矩陣數(shù)據(jù),因此將出現(xiàn)隨機值。如果想避免這種情況,可使用Mat類的幾種初始化創(chuàng)建矩陣的方法:
?
[cpp]?view plain?copy
運行結果:
?
?
2.?矩陣運算
?
2.1?基本概念
?OpenCV的Mat類允許所有的矩陣運算。
?
2.2?矩陣加減法
我們可以使用"+"和"-"符號進行矩陣加減運算。
[cpp]?view plain?copy
?
?
?
?
2.3?矩陣乘法
使用"*"號計算矩陣與標量相乘,矩陣與矩陣相乘(必須滿足矩陣相乘的行列數(shù)對應規(guī)則)
?
[cpp]?view plain?copy
?
?
2.4?矩陣轉置
矩陣轉置是將矩陣的行與列順序對調(diào)(第i行轉變?yōu)榈趇列)形成一個新的矩陣。OpenCV通過Mat類的t()函數(shù)實現(xiàn)。
[cpp]?view plain?copy
運行結果:
?
?
?
2.5?求逆矩陣
逆矩陣在某些算法中經(jīng)常出現(xiàn),在OpenCV中通過Mat類的inv()方法實現(xiàn)
[cpp]?view plain?copy
運行結果:
?
單位矩陣的逆就是其本身。
?
?
2.6?計算矩陣非零元素個數(shù)
計算物體的像素或面積常需要用到計算矩陣中的非零元素個數(shù),OpenCV中使用countNonZero()函數(shù)實現(xiàn)。
?
?
[cpp]?view plain?copy
運行結果:
?
?
?
2.7?均值和標準差
OpenCV提供了矩陣均值和標準差計算功能,可以使用meanStdDev(src,mean,stddev)函數(shù)實現(xiàn)。
?
參數(shù)
?
?
- src?–?輸入矩陣或圖像
- mean?–?均值,OutputArray
- stddev?–?標準差,OutputArray
?
[cpp]?view plain?copy
運行結果:
需要說明的是,如果src是多通道圖像或多維矩陣,則函數(shù)分別計算不同通道的均值與標準差,因此返回值mean和stddev為對應維度的向量。
?
[cpp]?view plain?copy
多通道矩陣運算結果:
?
?
2.8?求最大最小值
求輸入矩陣的全局最大最小值及其位置,可使用函數(shù):
?
?
[cpp]?view plain?copy
?
參數(shù):
?
- src?– 輸入單通道矩陣(圖像).
- minVal?– 指向最小值的指針,?如果未指定則使用NULL
- maxVal?– 指向最大值的指針,?如果未指定則使用NULL
- minLoc?– 指向最小值位置(2維情況)的指針,?如果未指定則使用NULL
- maxLoc?– 指向最大值位置(2維情況)的指針,?如果未指定則使用NULL
- mask?– 可選的蒙版,用于選擇待處理子區(qū)域
?
[cpp]?view plain?copy
運行結果:
輸入圖像及其最大最小值位置
?
?
3.?其他矩陣運算
其他矩陣運算函數(shù)見下表:
?
?
| Function?(函數(shù)名) | Use?(函數(shù)用處) |
| add | 矩陣加法,A+B的更高級形式,支持mask |
| scaleAdd | 矩陣加法,一個帶有縮放因子dst(I)?=?scale?*?src1(I)?+?src2(I) |
| addWeighted | 矩陣加法,兩個帶有縮放因子dst(I)?=?saturate(src1(I)?*?alpha?+?src2(I)?*?beta?+?gamma) |
| subtract | 矩陣減法,A-B的更高級形式,支持mask |
| multiply | 矩陣逐元素乘法,同Mat::mul()函數(shù),與A*B區(qū)別,支持mask |
| gemm | 一個廣義的矩陣乘法操作 |
| divide | 矩陣逐元素除法,與A/B區(qū)別,支持mask |
| abs | 對每個元素求絕對值 |
| absdiff | 兩個矩陣的差的絕對值 |
| exp | 求每個矩陣元素?src(I)?的自然數(shù)?e?的?src(I)?次冪?dst[I]?=?esrc(I) |
| pow | 求每個矩陣元素?src(I)?的?p?次冪?dst[I]?=?src(I)p |
| log | 求每個矩陣元素的自然數(shù)底?dst[I]?=?log|src(I)|?(if?src?!=?0) |
| sqrt | 求每個矩陣元素的平方根 |
| min,?max | 求每個元素的最小值或最大值返回這個矩陣?dst(I)?=?min(src1(I),?src2(I)),?max同 |
| minMaxLoc | 定位矩陣中最小值、最大值的位置 |
| compare | 返回逐個元素比較結果的矩陣 |
| bitwise_and,?bitwise_not,?bitwise_or,?bitwise_xor | 每個元素進行位運算,分別是和、非、或、異或 |
| cvarrToMat | 舊版數(shù)據(jù)CvMat,IplImage,CvMatND轉換到新版數(shù)據(jù)Mat |
| extractImageCOI | 從舊版數(shù)據(jù)中提取指定的通道矩陣給新版數(shù)據(jù)Mat |
| randu | 以Uniform分布產(chǎn)生隨機數(shù)填充矩陣,同?RNG::fill(mat,?RNG::UNIFORM) |
| randn | 以Normal分布產(chǎn)生隨機數(shù)填充矩陣,同?RNG::fill(mat,?RNG::NORMAL) |
| randShuffle | 隨機打亂一個一維向量的元素順序 |
| theRNG() | 返回一個默認構造的RNG類的對象 ?theRNG()::fill(...) |
| reduce | 矩陣縮成向量 |
| repeat | 矩陣拷貝的時候指定按x/y方向重復 |
| split | 多通道矩陣分解成多個單通道矩陣 |
| merge | 多個單通道矩陣合成一個多通道矩陣 |
| mixChannels | 矩陣間通道拷貝,如Rgba[]到Rgb[]和Alpha[] |
| sort,?sortIdx | 為矩陣的每行或每列元素排序 |
| setIdentity | 設置單元矩陣 |
| completeSymm | 矩陣上下三角拷貝 |
| inRange | 檢查元素的取值范圍是否在另兩個矩陣的元素取值之間,返回驗證矩陣 |
| checkRange | 檢查矩陣的每個元素的取值是否在最小值與最大值之間,返回驗證結果bool |
| sum | 求矩陣的元素和 |
| mean | 求均值 |
| meanStdDev | 均值和標準差 |
| countNonZero | 統(tǒng)計非零值個數(shù) |
| cartToPolar,?polarToCart | 笛卡爾坐標與極坐標之間的轉換 |
| flip | 矩陣翻轉 |
| transpose | 矩陣轉置,比較?Mat::t()?AT |
| trace | 矩陣的跡 |
| determinant | 行列式?|A|,?det(A) |
| eigen | 矩陣的特征值和特征向量 |
| invert | 矩陣的逆或者偽逆,比較?Mat::inv() |
| magnitude | 向量長度計算?dst(I)?=?sqrt(x(I)2?+?y(I)2) |
| Mahalanobis | Mahalanobis距離計算 |
| phase | 相位計算,即兩個向量之間的夾角 |
| norm | 求范數(shù),1-范數(shù)、2-范數(shù)、無窮范數(shù) |
| normalize | 標準化 |
| mulTransposed | 矩陣和它自己的轉置相乘?AT?*?A,?dst?=?scale(src?-?delta)T(src?-?delta) |
| convertScaleAbs | 先縮放元素再取絕對值,最后轉換格式為8bit型 |
| calcCovarMatrix | 計算協(xié)方差陣 |
| solve | 求解1個或多個線性系統(tǒng)或者求解最小平方問題(least-squares?problem) |
| solveCubic | 求解三次方程的根 |
| solvePoly | 求解多項式的實根和重根 |
| dct,?idct | 正、逆離散余弦變換,idct同dct(src,?dst,?flags?|?DCT_INVERSE) |
| dft,?idft | 正、逆離散傅立葉變換,?idft同dft(src,?dst,?flags?|?DTF_INVERSE) |
| LUT | 查表變換 |
| getOptimalDFTSize | 返回一個優(yōu)化過的DFT大小 |
| mulSpecturms | 兩個傅立葉頻譜間逐元素的乘法 |
?
?
上表引自:http://blog.sina.com.cn/s/blog_7908e1290101i97z.html
?
轉載請注明出處(本文更新鏈接):http://blog.csdn.net/iracer/article/details/51296631
版權聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉載。
- 本文已收錄于以下專欄:
- Bin博士的機器視覺工作間
總結
以上是生活随笔為你收集整理的opencv简单的矩阵操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PyTorch框架学习十九——模型加载与
- 下一篇: FCOS: A Simple and S