OpenCVマトリクス操作CvMat

3782 ワード

OpenCVマトリクス操作CvMat
  • 概要:
  • OpenCVにはマトリクス操作に対するC言語関数がある.他の多くの方法は、OpenCVと同様の効率を有するより便利なC++インターフェースを提供する.
  • OpenCVはベクトルを1次元マトリクスとして処理する.
  • 行列は行ごとに記憶する、行ごとに4バイトの校正がある.

  • 分配マトリクス空間:
    CvMat* cvCreateMat(int rows, int cols, int type);

    type: . CV_<bit_depth>(S|U|F)C<number_of_channels>. : CV_8UC1 8 , CV_32SC2 32 .
    : CvMat* M = cvCreateMat(4,4,CV_32FC1);
  • 解放行列空間:
    CvMat* M = cvCreateMat(4,4,CV_32FC1);
    
    cvReleaseMat(&M);
  • コピーマトリックス:
    CvMat* M1 = cvCreateMat(4,4,CV_32FC1);
    CvMat* M2;
    M2=cvCloneMat(M1);
  • 初期化マトリクス:
    double a[] = { 1,   2,   3,   4,
    5, 6, 7, 8, 9, 10, 11, 12 };

    CvMat Ma=cvMat(3, 4, CV_64FC1, a);
    :
    CvMat Ma;
    
    cvInitMatHeader(&Ma, 3, 4, CV_64FC1, a);
  • 初期化マトリクス単位アレイ:
    CvMat* M = cvCreateMat(4,4,CV_32FC1);
    
    cvSetIdentity(M); //        ,   
  • アクセスマトリックス要素
  • は、2次元浮動小数点行列の(i,j)番目の要素にアクセスする必要があると仮定する.
  • 間接アクセスマトリクス要素:
  • cvmSet(M,i,j,2.0); // Set M(i,j)
    
    t = cvmGet(M,i,j); // Get M(i,j)
  • 直接アクセス、4バイト補正を使用すると仮定:
    CvMat* M     = cvCreateMat(4,4,CV_32FC1);
    
    int n        = M->cols;
    
    float *data = M->data.fl;
    
    data[i*n+j] = 3.0;
  • 直接アクセス、補正バイト任意:
    CvMat* M     = cvCreateMat(4,4,CV_32FC1);
    int step = M->step/sizeof(float);
    float *data = M->data.fl;

    (data+i*step)[j] = 3.0;
  • 初期化マトリクス要素への直接アクセス:
    double a[16];
    
    CvMat Ma = cvMat(3, 4, CV_64FC1, a);
    
    a[i*4+j] = 2.0; // Ma(i,j)=2.0;
  • 行列/ベクトル操作
  • マトリクス-マトリクス動作:
    CvMat *Ma, *Mb, *Mc;
    
    cvAdd(Ma, Mb, Mc);       // Ma+Mb    -> Mc
    
    cvSub(Ma, Mb, Mc);       // Ma-Mb    -> Mc
    
    cvMatMul(Ma, Mb, Mc);    // Ma*Mb    -> Mc
  • 要素別マトリクス操作:
    CvMat *Ma, *Mb, *Mc;
    
    cvMul(Ma, Mb, Mc);       // Ma.*Mb   -> Mc
    
    cvDiv(Ma, Mb, Mc);       // Ma./Mb   -> Mc
    
    cvAddS(Ma, cvScalar(-10.0), Mc); // Ma.-10 -> Mc
  • ベクトル積:
    double va[] = {1, 2, 3};
    
    double vb[] = {0, 0, 1};
    
    double vc[3];
    CvMat Va=cvMat(3, 1, CV_64FC1, va); CvMat Vb=cvMat(3, 1, CV_64FC1, vb); CvMat Vc=cvMat(3, 1, CV_64FC1, vc);
    double res=cvDotProduct(&Va,&Vb); // : Va . Vb -> res cvCrossProduct(&Va, &Vb, &Vc); // : Va x Vb -> Vc end{verbatim}
    注意Va,Vb,Vcベクトル積におけるベクトル要素の個数は同一である.
  • 単一マトリクス動作:
    CvMat *Ma, *Mb;
    
    cvTranspose(Ma, Mb);       // transpose(Ma) -> Mb (         )
    
    CvScalar t = cvTrace(Ma); // trace(Ma) -> t.val[0] 
    
    double d = cvDet(Ma);      // det(Ma) -> d
    
    cvInvert(Ma, Mb);          // inv(Ma) -> Mb
  • 非整列線形系解:
    CvMat* A   = cvCreateMat(3,3,CV_32FC1);
    
    CvMat* x   = cvCreateMat(3,1,CV_32FC1);
    
    CvMat* b   = cvCreateMat(3,1,CV_32FC1);
    
    cvSolve(&A, &b, &x);     // solve (Ax=b) for x
  • 特徴値分析(対称行列に対する):
    CvMat* A   = cvCreateMat(3,3,CV_32FC1);
    
    CvMat* E   = cvCreateMat(3,3,CV_32FC1);
    
    CvMat* l   = cvCreateMat(3,1,CV_32FC1);
    
    cvEigenVV(&A, &E, &l);   // l = A     (    )
    // E = ( )
  • 特異値分解SVD:
    CvMat* A   = cvCreateMat(3,3,CV_32FC1);
    
    CvMat* U   = cvCreateMat(3,3,CV_32FC1);
    
    CvMat* D   = cvCreateMat(3,3,CV_32FC1);
    
    CvMat* V   = cvCreateMat(3,3,CV_32FC1);
    
    cvSVD(A, D, U, V, CV_SVD_U_T|CV_SVD_V_T); // A = U D V^T