1. 程式人生 > >OpenCV的基本矩陣操作與示例

OpenCV的基本矩陣操作與示例

2.3 矩陣乘法

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

  1. Mat m1= Mat::eye(2,3, CV_32F); //使用cv名稱空間可省略cv::字首,下同
  2. Mat m2= Mat::ones(3,2, CV_32F);  
  3. cout<<"m1  = "<<endl<<m1<<endl<<endl;  
  4. cout<<"m2  = "<<endl<<m2<<endl<<endl;  
  5. // Scalar by matrix
  6. cout << "\nm1.*2 = \n" << m1*2 << endl;  
  7. // matrix per element multiplication
  8. cout << "\n(m1+2).*(m1+3) = \n" << (m1+1).mul(m1+3) << endl;  
  9. // Matrix multiplication
  10. cout << "\nm1*m2 = \n" << m1*m2 << endl;  


2.4 矩陣轉置

矩陣轉置是將矩陣的行與列順序對調(第i行轉變為第i列)形成一個新的矩陣。OpenCV通過Mat類的t()函式實現。
  1. // 轉置
  2.     Mat m1= Mat::eye(2,3, CV_32F);    
  3.     Mat m1t = m1.t();  
  4.     cout<<"m1  = "<<endl<<m1<<endl<<endl;  
  5.     cout<<"m1t  = "<<endl<<m1t<<endl<<endl;  
  6.     system("pause");  
執行結果:

2.5 求逆矩陣

逆矩陣在某些演算法中經常出現,在OpenCV中通過Mat類的inv()方法實現
  1. // 求逆
  2.     Mat meinv = me.inv();  
  3.     cout<<"me  = "<<endl<<me<<endl<<endl;  
  4.     cout<<"meinv = "<<endl<<meinv<<endl<<endl;  
  5.     system("pause");  
執行結果:

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

2.6 計算矩陣非零元素個數

計算物體的畫素或面積常需要用到計算矩陣中的非零元素個數,OpenCV中使用countNonZero()函式實現。
  1. // 非零元素個數
  2.     int nonZerosNum = countNonZero(me); // me為輸入矩陣或影象
  3.     cout<<"me  = "<<endl<<me<<endl;  
  4.     cout<<"me中非零元素個數 = "<<nonZerosNum<<endl<<endl;  
  5.     system("pause");  
執行結果:

2.7 均值和標準差

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

引數

  • src – 輸入矩陣或影象
  • mean – 均值,OutputArray
  • stddev – 標準差,OutputArray
  1. // 均值方差
  2.     Mat mean;  
  3.     Mat stddev;  
  4.     meanStdDev(me, mean, stddev); //me為前文定義的5×5對角陣
  5.     cout<<"mean = "<<mean<<endl;  
  6.     cout<<"stddev = "<<stddev<<endl;  
  7.     system("pause");  

執行結果:

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

  1. Mat mean3;  
  2. Mat stddev3;  
  3. Mat m3(cv::Size(5,5),CV_8UC3,Scalar(255,200,100));  
  4. cout<<"m3  = "<<endl<<m3<<endl<<endl;  
  5. meanStdDev(m3, mean3, stddev3);  
  6. cout<<"mean3 = "<<mean3<<endl;  
  7. cout<<"stddev3 = "<<stddev3<<endl;  
  8. system("pause");  

多通道矩陣運算結果:



2.8 求最大最小值

求輸入矩陣的全域性最大最小值及其位置,可使用函式:
  1. void minMaxLoc(InputArray src, CV_OUT double* minVal,  
  2.                            CV_OUT double* maxVal=0, CV_OUT Point* minLoc=0,  
  3.                            CV_OUT Point* maxLoc=0, InputArray mask=noArray());  

引數:

  • src – 輸入單通道矩陣(影象).
  • minVal – 指向最小值的指標, 如果未指定則使用NULL
  • maxVal – 指向最大值的指標, 如果未指定則使用NULL
  • minLoc – 指向最小值位置(2維情況)的指標, 如果未指定則使用NULL
  • maxLoc – 指向最大值位置(2維情況)的指標, 如果未指定則使用NULL
  • mask – 可選的蒙版,用於選擇待處理子區域
  1. // 求極值 最大、最小值及其位置
  2.     Mat img = imread("Lena.jpg",0);  
  3.     imshow("original image",img);  
  4.     double minVal=0,maxVal=0;  
  5.     cv::Point minPt, maxPt;  
  6.     minMaxLoc(img,&minVal,&maxVal,&minPt,&maxPt);  
  7.     cout<<"min value  = "<<minVal<<endl;  
  8.     cout<<"max value  = "<<maxVal<<endl;  
  9.     cout<<"minPt = ("<<minPt.x<<","<<minPt.y<<")"<<endl;  
  10.     cout<<"maxPt = ("<<maxPt.x<<","<<maxPt.y<<")"<<endl;  
  11.     cout<<endl;  
  12.     cv::Rect rectMin(minPt.x-10,minPt.y-10,20,20);  
  13.     cv::Rect rectMax(maxPt.x-10,maxPt.y-10,20,20);  
  14.     cv::rectangle(img,rectMin,cv::Scalar(200),2);  
  15.     cv::rectangle(img,rectMax,cv::Scalar(255),2);  
  16.     imshow("image with min max location",img);  
  17.     cv::waitKey();  
執行結果: