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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

opencv简单的矩阵操作

發(fā)布時間:2024/7/23 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv简单的矩阵操作 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

  • CV_8UC1//?8位無符號單通道??
  • CV_8UC3//?8位無符號3通道??
  • CV_8UC4??
  • CV_32FC1//?32位浮點型單通道??
  • CV_32FC3//?32位浮點型3通道??
  • CV_32FC4??
  • ?

    包括數(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

  • //?基本方法??
  • ????cv::Mat?a(cv::Size(5,5),CV_8UC1);?//?單通道??
  • ????cv::Mat?b?=?cv::Mat(cv::Size(5,5),CV_8UC3);?//3通道每個矩陣元素包含3個uchar值??
  • ????cout<<"a??=?"<<endl<<a<<endl<<endl;??
  • ????cout<<"b??=?"<<endl<<b<<endl<<endl;??
  • ????system("pause");??
  • 運行結果:

    3通道矩陣中,一個矩陣元素包含3個變量。

    ?

    1.3?初始化方法

    上述方法不初始化矩陣數(shù)據(jù),因此將出現(xiàn)隨機值。如果想避免這種情況,可使用Mat類的幾種初始化創(chuàng)建矩陣的方法:

    ?

    [cpp]?view plain?copy

  • //?初始化方法??
  • ????cv::Mat?mz?=?cv::Mat::zeros(cv::Size(5,5),CV_8UC1);?//?全零矩陣??
  • ????cv::Mat?mo?=?cv::Mat::ones(cv::Size(5,5),CV_8UC1);??//?全1矩陣??
  • ????cv::Mat?me?=?cv::Mat::eye(cv::Size(5,5),CV_32FC1);??//?對角線為1的對角矩陣??
  • ????cout<<"mz?=?"<<endl<<mz<<endl<<endl;??
  • ????cout<<"mo?=?"<<endl<<mo<<endl<<endl;??
  • ????cout<<"me?=?"<<endl<<me<<endl<<endl;??
  • 運行結果:

    ?

    ?

    2.?矩陣運算

    ?

    2.1?基本概念

    ?OpenCV的Mat類允許所有的矩陣運算。

    ?

    2.2?矩陣加減法

    我們可以使用"+"和"-"符號進行矩陣加減運算。

    [cpp]?view plain?copy

  • cv::Mat?a=?Mat::eye(Size(3,2),?CV_32F);??
  • cv::Mat?b=?Mat::ones(Size(3,2),?CV_32F);??
  • cv::Mat?c=?a+b;??
  • cv::Mat?d=?a-b;??
  • ?

    ?

    ?

    ?

    2.3?矩陣乘法

    使用"*"號計算矩陣與標量相乘,矩陣與矩陣相乘(必須滿足矩陣相乘的行列數(shù)對應規(guī)則)

    ?

    [cpp]?view plain?copy

  • Mat?m1=?Mat::eye(2,3,?CV_32F);?//使用cv命名空間可省略cv::前綴,下同??
  • Mat?m2=?Mat::ones(3,2,?CV_32F);??
  • cout<<"m1??=?"<<endl<<m1<<endl<<endl;??
  • cout<<"m2??=?"<<endl<<m2<<endl<<endl;??
  • //?Scalar?by?matrix??
  • cout?<<?"\nm1.*2?=?\n"?<<?m1*2?<<?endl;??
  • //?matrix?per?element?multiplication??
  • cout?<<?"\n(m1+2).*(m1+3)?=?\n"?<<?(m1+1).mul(m1+3)?<<?endl;??
  • //?Matrix?multiplication??
  • cout?<<?"\nm1*m2?=?\n"?<<?m1*m2?<<?endl;??
  • ?

    ?

    2.4?矩陣轉置

    矩陣轉置是將矩陣的行與列順序對調(diào)(第i行轉變?yōu)榈趇列)形成一個新的矩陣。OpenCV通過Mat類的t()函數(shù)實現(xiàn)。

    [cpp]?view plain?copy

  • //?轉置??
  • ????Mat?m1=?Mat::eye(2,3,?CV_32F);????
  • ????Mat?m1t?=?m1.t();??
  • ????cout<<"m1??=?"<<endl<<m1<<endl<<endl;??
  • ????cout<<"m1t??=?"<<endl<<m1t<<endl<<endl;??
  • ????system("pause");??
  • 運行結果:

    ?

    ?

    ?

    2.5?求逆矩陣

    逆矩陣在某些算法中經(jīng)常出現(xiàn),在OpenCV中通過Mat類的inv()方法實現(xiàn)

    [cpp]?view plain?copy

  • //?求逆??
  • ????Mat?meinv?=?me.inv();??
  • ????cout<<"me??=?"<<endl<<me<<endl<<endl;??
  • ????cout<<"meinv?=?"<<endl<<meinv<<endl<<endl;??
  • ????system("pause");??
  • 運行結果:

    ?

    單位矩陣的逆就是其本身。
    ?

    ?

    2.6?計算矩陣非零元素個數(shù)

    計算物體的像素或面積常需要用到計算矩陣中的非零元素個數(shù),OpenCV中使用countNonZero()函數(shù)實現(xiàn)。

    ?

    ?

    [cpp]?view plain?copy

  • //?非零元素個數(shù)??
  • ????int?nonZerosNum?=?countNonZero(me);?//?me為輸入矩陣或圖像??
  • ????cout<<"me??=?"<<endl<<me<<endl;??
  • ????cout<<"me中非零元素個數(shù)?=?"<<nonZerosNum<<endl<<endl;??
  • ????system("pause");??
  • 運行結果:

    ?

    ?

    ?

    2.7?均值和標準差

    OpenCV提供了矩陣均值和標準差計算功能,可以使用meanStdDev(src,mean,stddev)函數(shù)實現(xiàn)。

    ?

    參數(shù)

    ?

    ?

    • src?–?輸入矩陣或圖像
    • mean?–?均值,OutputArray
    • stddev?–?標準差,OutputArray

    ?

    [cpp]?view plain?copy

  • //?均值方差??
  • ????Mat?mean;??
  • ????Mat?stddev;??
  • ????meanStdDev(me,?mean,?stddev);?//me為前文定義的5×5對角陣??
  • ????cout<<"mean?=?"<<mean<<endl;??
  • ????cout<<"stddev?=?"<<stddev<<endl;??
  • ????system("pause");??
  • 運行結果:

    需要說明的是,如果src是多通道圖像或多維矩陣,則函數(shù)分別計算不同通道的均值與標準差,因此返回值mean和stddev為對應維度的向量。

    ?

    [cpp]?view plain?copy

  • Mat?mean3;??
  • Mat?stddev3;??
  • Mat?m3(cv::Size(5,5),CV_8UC3,Scalar(255,200,100));??
  • cout<<"m3??=?"<<endl<<m3<<endl<<endl;??
  • meanStdDev(m3,?mean3,?stddev3);??
  • cout<<"mean3?=?"<<mean3<<endl;??
  • cout<<"stddev3?=?"<<stddev3<<endl;??
  • system("pause");??
  • 多通道矩陣運算結果:

    ?

    ?

    2.8?求最大最小值

    求輸入矩陣的全局最大最小值及其位置,可使用函數(shù):

    ?

    ?

    [cpp]?view plain?copy

  • void?minMaxLoc(InputArray?src,?CV_OUT?double*?minVal,??
  • ???????????????????????????CV_OUT?double*?maxVal=0,?CV_OUT?Point*?minLoc=0,??
  • ???????????????????????????CV_OUT?Point*?maxLoc=0,?InputArray?mask=noArray());??
  • ?

    參數(shù):

    ?

    • src?– 輸入單通道矩陣(圖像).
    • minVal?– 指向最小值的指針,?如果未指定則使用NULL
    • maxVal?– 指向最大值的指針,?如果未指定則使用NULL
    • minLoc?– 指向最小值位置(2維情況)的指針,?如果未指定則使用NULL
    • maxLoc?– 指向最大值位置(2維情況)的指針,?如果未指定則使用NULL
    • mask?– 可選的蒙版,用于選擇待處理子區(qū)域

    ?

    [cpp]?view plain?copy

  • //?求極值?最大、最小值及其位置??
  • ????Mat?img?=?imread("Lena.jpg",0);??
  • ????imshow("original?image",img);??
  • ??
  • ????double?minVal=0,maxVal=0;??
  • ????cv::Point?minPt,?maxPt;??
  • ????minMaxLoc(img,&minVal,&maxVal,&minPt,&maxPt);??
  • ????cout<<"min?value??=?"<<minVal<<endl;??
  • ????cout<<"max?value??=?"<<maxVal<<endl;??
  • ????cout<<"minPt?=?("<<minPt.x<<","<<minPt.y<<")"<<endl;??
  • ????cout<<"maxPt?=?("<<maxPt.x<<","<<maxPt.y<<")"<<endl;??
  • ????cout<<endl;??
  • ??
  • ????cv::Rect?rectMin(minPt.x-10,minPt.y-10,20,20);??
  • ????cv::Rect?rectMax(maxPt.x-10,maxPt.y-10,20,20);??
  • ??
  • ????cv::rectangle(img,rectMin,cv::Scalar(200),2);??
  • ????cv::rectangle(img,rectMax,cv::Scalar(255),2);??
  • ??
  • ????imshow("image?with?min?max?location",img);??
  • ????cv::waitKey();??
  • 運行結果:

    輸入圖像及其最大最小值位置

    ?

    ?

    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

  • CV_8UC1//?8位無符號單通道??
  • CV_8UC3//?8位無符號3通道??
  • CV_8UC4??
  • CV_32FC1//?32位浮點型單通道??
  • CV_32FC3//?32位浮點型3通道??
  • CV_32FC4??
  • ?

    包括數(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

  • //?基本方法??
  • ????cv::Mat?a(cv::Size(5,5),CV_8UC1);?//?單通道??
  • ????cv::Mat?b?=?cv::Mat(cv::Size(5,5),CV_8UC3);?//3通道每個矩陣元素包含3個uchar值??
  • ????cout<<"a??=?"<<endl<<a<<endl<<endl;??
  • ????cout<<"b??=?"<<endl<<b<<endl<<endl;??
  • ????system("pause");??
  • 運行結果:

    3通道矩陣中,一個矩陣元素包含3個變量。

    ?

    1.3?初始化方法

    上述方法不初始化矩陣數(shù)據(jù),因此將出現(xiàn)隨機值。如果想避免這種情況,可使用Mat類的幾種初始化創(chuàng)建矩陣的方法:

    ?

    [cpp]?view plain?copy

  • //?初始化方法??
  • ????cv::Mat?mz?=?cv::Mat::zeros(cv::Size(5,5),CV_8UC1);?//?全零矩陣??
  • ????cv::Mat?mo?=?cv::Mat::ones(cv::Size(5,5),CV_8UC1);??//?全1矩陣??
  • ????cv::Mat?me?=?cv::Mat::eye(cv::Size(5,5),CV_32FC1);??//?對角線為1的對角矩陣??
  • ????cout<<"mz?=?"<<endl<<mz<<endl<<endl;??
  • ????cout<<"mo?=?"<<endl<<mo<<endl<<endl;??
  • ????cout<<"me?=?"<<endl<<me<<endl<<endl;??
  • 運行結果:

    ?

    ?

    2.?矩陣運算

    ?

    2.1?基本概念

    ?OpenCV的Mat類允許所有的矩陣運算。

    ?

    2.2?矩陣加減法

    我們可以使用"+"和"-"符號進行矩陣加減運算。

    [cpp]?view plain?copy

  • cv::Mat?a=?Mat::eye(Size(3,2),?CV_32F);??
  • cv::Mat?b=?Mat::ones(Size(3,2),?CV_32F);??
  • cv::Mat?c=?a+b;??
  • cv::Mat?d=?a-b;??
  • ?

    ?

    ?

    ?

    2.3?矩陣乘法

    使用"*"號計算矩陣與標量相乘,矩陣與矩陣相乘(必須滿足矩陣相乘的行列數(shù)對應規(guī)則)

    ?

    [cpp]?view plain?copy

  • Mat?m1=?Mat::eye(2,3,?CV_32F);?//使用cv命名空間可省略cv::前綴,下同??
  • Mat?m2=?Mat::ones(3,2,?CV_32F);??
  • cout<<"m1??=?"<<endl<<m1<<endl<<endl;??
  • cout<<"m2??=?"<<endl<<m2<<endl<<endl;??
  • //?Scalar?by?matrix??
  • cout?<<?"\nm1.*2?=?\n"?<<?m1*2?<<?endl;??
  • //?matrix?per?element?multiplication??
  • cout?<<?"\n(m1+2).*(m1+3)?=?\n"?<<?(m1+1).mul(m1+3)?<<?endl;??
  • //?Matrix?multiplication??
  • cout?<<?"\nm1*m2?=?\n"?<<?m1*m2?<<?endl;??
  • ?

    ?

    2.4?矩陣轉置

    矩陣轉置是將矩陣的行與列順序對調(diào)(第i行轉變?yōu)榈趇列)形成一個新的矩陣。OpenCV通過Mat類的t()函數(shù)實現(xiàn)。

    [cpp]?view plain?copy

  • //?轉置??
  • ????Mat?m1=?Mat::eye(2,3,?CV_32F);????
  • ????Mat?m1t?=?m1.t();??
  • ????cout<<"m1??=?"<<endl<<m1<<endl<<endl;??
  • ????cout<<"m1t??=?"<<endl<<m1t<<endl<<endl;??
  • ????system("pause");??
  • 運行結果:

    ?

    ?

    ?

    2.5?求逆矩陣

    逆矩陣在某些算法中經(jīng)常出現(xiàn),在OpenCV中通過Mat類的inv()方法實現(xiàn)

    [cpp]?view plain?copy

  • //?求逆??
  • ????Mat?meinv?=?me.inv();??
  • ????cout<<"me??=?"<<endl<<me<<endl<<endl;??
  • ????cout<<"meinv?=?"<<endl<<meinv<<endl<<endl;??
  • ????system("pause");??
  • 運行結果:

    ?

    單位矩陣的逆就是其本身。
    ?

    ?

    2.6?計算矩陣非零元素個數(shù)

    計算物體的像素或面積常需要用到計算矩陣中的非零元素個數(shù),OpenCV中使用countNonZero()函數(shù)實現(xiàn)。

    ?

    ?

    [cpp]?view plain?copy

  • //?非零元素個數(shù)??
  • ????int?nonZerosNum?=?countNonZero(me);?//?me為輸入矩陣或圖像??
  • ????cout<<"me??=?"<<endl<<me<<endl;??
  • ????cout<<"me中非零元素個數(shù)?=?"<<nonZerosNum<<endl<<endl;??
  • ????system("pause");??
  • 運行結果:

    ?

    ?

    ?

    2.7?均值和標準差

    OpenCV提供了矩陣均值和標準差計算功能,可以使用meanStdDev(src,mean,stddev)函數(shù)實現(xiàn)。

    ?

    參數(shù)

    ?

    ?

    • src?–?輸入矩陣或圖像
    • mean?–?均值,OutputArray
    • stddev?–?標準差,OutputArray

    ?

    [cpp]?view plain?copy

  • //?均值方差??
  • ????Mat?mean;??
  • ????Mat?stddev;??
  • ????meanStdDev(me,?mean,?stddev);?//me為前文定義的5×5對角陣??
  • ????cout<<"mean?=?"<<mean<<endl;??
  • ????cout<<"stddev?=?"<<stddev<<endl;??
  • ????system("pause");??
  • 運行結果:

    需要說明的是,如果src是多通道圖像或多維矩陣,則函數(shù)分別計算不同通道的均值與標準差,因此返回值mean和stddev為對應維度的向量。

    ?

    [cpp]?view plain?copy

  • Mat?mean3;??
  • Mat?stddev3;??
  • Mat?m3(cv::Size(5,5),CV_8UC3,Scalar(255,200,100));??
  • cout<<"m3??=?"<<endl<<m3<<endl<<endl;??
  • meanStdDev(m3,?mean3,?stddev3);??
  • cout<<"mean3?=?"<<mean3<<endl;??
  • cout<<"stddev3?=?"<<stddev3<<endl;??
  • system("pause");??
  • 多通道矩陣運算結果:

    ?

    ?

    2.8?求最大最小值

    求輸入矩陣的全局最大最小值及其位置,可使用函數(shù):

    ?

    ?

    [cpp]?view plain?copy

  • void?minMaxLoc(InputArray?src,?CV_OUT?double*?minVal,??
  • ???????????????????????????CV_OUT?double*?maxVal=0,?CV_OUT?Point*?minLoc=0,??
  • ???????????????????????????CV_OUT?Point*?maxLoc=0,?InputArray?mask=noArray());??
  • ?

    參數(shù):

    ?

    • src?– 輸入單通道矩陣(圖像).
    • minVal?– 指向最小值的指針,?如果未指定則使用NULL
    • maxVal?– 指向最大值的指針,?如果未指定則使用NULL
    • minLoc?– 指向最小值位置(2維情況)的指針,?如果未指定則使用NULL
    • maxLoc?– 指向最大值位置(2維情況)的指針,?如果未指定則使用NULL
    • mask?– 可選的蒙版,用于選擇待處理子區(qū)域

    ?

    [cpp]?view plain?copy

  • //?求極值?最大、最小值及其位置??
  • ????Mat?img?=?imread("Lena.jpg",0);??
  • ????imshow("original?image",img);??
  • ??
  • ????double?minVal=0,maxVal=0;??
  • ????cv::Point?minPt,?maxPt;??
  • ????minMaxLoc(img,&minVal,&maxVal,&minPt,&maxPt);??
  • ????cout<<"min?value??=?"<<minVal<<endl;??
  • ????cout<<"max?value??=?"<<maxVal<<endl;??
  • ????cout<<"minPt?=?("<<minPt.x<<","<<minPt.y<<")"<<endl;??
  • ????cout<<"maxPt?=?("<<maxPt.x<<","<<maxPt.y<<")"<<endl;??
  • ????cout<<endl;??
  • ??
  • ????cv::Rect?rectMin(minPt.x-10,minPt.y-10,20,20);??
  • ????cv::Rect?rectMax(maxPt.x-10,maxPt.y-10,20,20);??
  • ??
  • ????cv::rectangle(img,rectMin,cv::Scalar(200),2);??
  • ????cv::rectangle(img,rectMax,cv::Scalar(255),2);??
  • ??
  • ????imshow("image?with?min?max?location",img);??
  • ????cv::waitKey();??
  • 運行結果:

    輸入圖像及其最大最小值位置

    ?

    ?

    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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。