1. 程式人生 > >opencv矩陣運算(3)

opencv矩陣運算(3)

簡介

  本篇承接上一篇,繼續opencv下矩陣計算的函式使用。

矩陣複製

具體程式碼

    printf("mat1:\n");
    showMatdate(mat1);
 
    mat3 = Mat(3, 3, CV_64FC1);
    src3 = mat3;
 
    cvRepeat(&src1, &src3);
    printf("cvRepeat(mat1):\n");
    showMatdate(mat3);

結果顯示

矩陣比例相加

具體程式碼

    printf("mat1:\n");
    showMatdate(
mat1); printf("mat2:\n"); showMatdate(mat2);   mat3 = Mat(3, 3, CV_64FC1); src3 = mat3;   tmp.val[0] = 1.5; cvScaleAdd(&src1, tmp, &src2, &src3); printf("cvScaleAdd(mat1, tmp, mat2):\n"); showMatdate(mat3);
   注意:mat3 = mat1 * tmp + mat2;

結果顯示

初始化矩陣對角線元素

具體程式碼

    printf("mat1:\n");
    showMatdate(mat1);
 
    mat3 = Mat(3, 3, CV_64FC1);
    src3 = mat3;
 
    tmp.val[0] = 1.5;
    cvSetIdentity(&src1, tmp);
    printf("cvSetIdentity(mat1, tmp):\n");                                                                                           
    showMatdate(
mat1);
   注意:對角線元素初始化為tmp,其他元素為0。

結果顯示

三次曲線方程實根

具體程式碼

    printf("mat2:\n");
    showMatdate(mat2);
 
    mat3 = Mat(1, 3, CV_64FC1);
    src3 = mat3;
 
    CvMat tmp1 = mat2;
    CvMat tmp2 = mat3;
 
    cvSolveCubic(&tmp1, &tmp2);
    printf("cvSolveCubic(mat2):\n");
    showMatdate(mat3);
   注意:實根可以有一個或者三個。

結果顯示

矩陣減法

具體程式碼

    printf("mat1:\n");
    showMatdate(mat1);
    printf("mat2:\n");
    showMatdate(mat2);
 
    mat3 = Mat(3, 3, CV_64FC1);
    src3 = mat3;
 
    cvSub(&src1, &src2, &src3);
    printf("cvSub(mat1, mat2):\n");                                                                                                  
    showMatdate(mat3);
    注意:1、void cvSub(const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* mask=NULL)
               最後可以選擇掩碼控制。
          2、void cvSubRS(const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL )
               dst = value - src。
          3、cvSubS(const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask=NULL)
               dst = src - val。

結果顯示

矩陣元素之和

具體程式碼

    printf("mat1:\n");
    showMatdate(mat1);
 
    tmp = cvSum(&src1);
    printf("cvSum(mat1);%lf\n", tmp.val[0]);

結果顯示

對角線元素之和

具體程式碼

    printf("mat1:\n");
    showMatdate(mat1);
 
    tmp = cvTrace(&src1);
    printf("cvTrace(mat1);%lf\n", tmp.val[0]);

結果顯示

計算矩陣轉置

具體程式碼

    printf("mat1:\n");
    showMatdate(mat1);
 
    cvTranspose(&src1, &src3);
    printf("cvTranspose(mat1);\n");
    showMatdate(mat3);

結果顯示

其他相關矩陣操作

1、計算向量的協方差:calcCovarMatrix

2、計算二維向量大小和角度:cartToPolar

3、檢查輸入矩陣中的無效值:checkRange

4、將其他矩陣格式轉換為Mat: C++: Mat cvarrToMat(const CvArr* arr, bool copyData=false, bool allowND=true, int coiMode=0 )

5、執行一維或二維陣列的正反餘弦變換: C++: void dct(InputArray src, OutputArray dst, int flags=0)

6、執行一維或二維陣列的正逆傅立葉變換: C++: void dft(InputArray src, OutputArray dst, int flags=0, int nonzeroRows=0)

7、計算對稱矩陣的特徵值和特徵向量: void cvEigenVV(CvArr* mat, CvArr* evects, CvArr* evals, double eps=0, int lowindex=-1, int highindex=-1 )

8、提取所選的影象通道: void extractImageCOI(const CvArr* arr, OutputArray coiimg, int coi=-1 )

9、將一個影象通道資料複製到舊的對應通道中: void insertImageCOI(InputArray coiimg, CvArr* arr, int coi=-1 )

10、執行廣義矩陣乘法: void cvGEMM(const CvArr* src1, const CvArr* src2, double alpha, const CvArr* src3, double beta, CvArr* dst, int tABC=0)

11、返回給定向量的最優DFT大小: C++: int getOptimalDFTSize(int vecsize)

12、返回一個單一畫素的轉換函式: C++: ConvertData getConvertElem(int fromType, int toType)

13、計算一維或者二維的逆離散餘弦變換: C++: void idct(InputArray src, OutputArray dst, int flags=0)

14、計算一維或者而且的逆離散傅立葉變換: C++: void idft(InputArray src, OutputArray dst, int flags=0, int nonzeroRows=0)

15、檢查陣列元素是否位於其他陣列元素之間: C++: void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst)

16、向量的透視矩陣變換 void cvPerspectiveTransform(const CvArr* src, CvArr* dst, const CvMat* mat)

17、解決一個或多個線性系統最小二乘法。 int cvSolve(const CvArr* src1, const CvArr* src2, CvArr* dst, int method=CV_LU)

18、執行每個陣列元素矩陣變換(可以用在影象旋轉)。 void cvTransform(const CvArr* src, CvArr* dst, const CvMat* transmat, const CvMat* shiftvec=NULL )