달력

12020  이전 다음

  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
http://nuitstory.tistory.com/8
nuit님 ㄳㄳ..

요즘 프로젝트 때문에 OpenCV를 사용하고 있는데
처음 쓰는거라 모르는게 너무 많아 이렇게 정리하려고한다...
레퍼런스는 영어라 귀찬고.. 이렇게 찾은거만이라도 정리를 해가 봐야지..

아 OpenCV에 PCA함수 까지 있다니.. 써보진 않았지만
이건 캐사기다....

1) [m,n]사이즈의 matrix 생성/ 소멸

CvMat* matrix = cvCreateMat(m,n, CV_32FC1);

 

CV_32FC1 : 실수원소

CV_64FC1 : 복소원소

 

cvReleaseMat(&matrixA); 이런식으로 메모리 해제 시키셈!

 

 

 

2) 행렬의 (i,j)번째 원소에 접근하는 방법

 

*원소의 값을 변경하려면,

 

((float*)(T->data.ptr + T->step*i))[j] 과 같이 직접적으로 접근할 수도 있지만, 이보다는,

다음과 같이 cvmSet함수를 이용하는것이 좋습니다! :)

 

cvmSet함수를 사용 - void cvmSet(CvMat *mat, int row, int col, double value);

 ex) cvmSet(matrix_name,i,j,value);

 

 

 

 

*원소의 값을 출력하려면,

 cvmGet함수를 사용 - void cvmSet(CvMat *mat, int row, int col);

 ex) double value = cvmGet(matrix_name,i,j);

 

 

3) 기본연산

 : 다음은 매트릭스의 기본 연산들 입니다. 네이버 OpenCV카페 블루(kimkima)님의 글을 참조합니다.

 

X = A + B cvmAdd(A, B, X)
X = AB cvmMul(A, B, X)
X = A 역행열 cvmInvert(A, X)
X = A ·B X = cvmDotProduct(A, B)
X = A ×B cvmCrossProduct(A, B, X)
X = trA X = cvmTrace(A)
X = |A X = cvmDet(A)
X = A 전치행렬 cvmTranspose(A, X)
X = A 유사 역행열 cvPseudoInv(A, X)

 

 s1,s2 : scalar

 X = s1A + s2      cvConvertScale(A,X,s1,s2)

 

4) 기타연산

 X = A              X = cvCloneMat(A)

 

 

5) 선형대수관련

 1)covariance matrix(Cs)구하기 : 일반적인 방식을 소개합니다. flag에 따라서 변형된 형태의 cov-matrix를 얻을 수도 있으니 필요하다면 reference를 참조 하시길..

  prototype)

   void cvCalcCovarMatrix( const CvArr** vects, int count,

                                             CvArr* cov_mat, CvArr* avg, int flags );

    vects : The input vectors.
    count : The number of input vectors.
    cov_mat : The output covariation matrix that should be floating-point and square.
    avg : The input or output array  
 
 
  example)
    CvMat** pca_shape = (CvMat**)malloc(sizeof(CvMat*)*3);
    for(i=0;i<3;i++) pca_shape[i] = cvCreateMat(3,1,CV_32FC1);

    cvmSet(pca_shape[0],0,0,3);
    cvmSet(pca_shape[0],1,0,0);
    cvmSet(pca_shape[0],2,0,0);
    cvmSet(pca_shape[1],0,0,0);
    cvmSet(pca_shape[1],1,0,9);
    cvmSet(pca_shape[1],2,0,0);
    cvmSet(pca_shape[2],0,0,0);
    cvmSet(pca_shape[2],1,0,0);
    cvmSet(pca_shape[2],2,0,12);
 
    const CvArr* pca_data[3];
    pca_data[0] = pca_shape[0];
    pca_data[1] = pca_shape[1];
    pca_data[2] = pca_shape[2];

    CvMat* mean_vector = cvCreateMat(3,1,CV_32FC1);

    CvMat* cov_matirx = cvCreateMat(3,3,CV_32FC1);
 
    //calculate cov-matrix
    cvCalcCovarMatrix(pca_data,3,cov_matirx,mean_vector,CV_COVAR_NORMAL);

 

 

   

 

 2)PCA 분석(eigenvalue, eigenvector구하는 함수) :

  prototype)

   void cvCalcPCA( const CvArr** data, CvArr* avg, 

                           CvArr* eigenvalues, CvArr* eigenvectors, int flags );

 

 

    data : The input data; each vector is either a single row (CV_PCA_DATA_AS_ROW) or
             a single column (CV_PCA_DATA_AS_COL).
    avg : The mean (average) vector, computed inside the function or provided by user.
    eigenvalues : The output eigenvalues of covariation matrix.
    eigenvectors The output eigenvectors of covariation matrix (i.e. principal componen
                      ts); one vector per row.

   

    *결과 eigenvalue벡터에는 값이 크기순으로 정렬되어 자장되며,eigenvectors들 역시

     eigenvalue의 크기에 맞추어 정렬되어 저장된다.

 

  example)

   CvMat* pca_data = cvCreateMat(3,3,CV_32FC1);
   cvmSet(pca_data,0,0,3);
   cvmSet(pca_data,1,0,0);
   cvmSet(pca_data,2,0,3);
   cvmSet(pca_data,0,1,0);
   cvmSet(pca_data,1,1,3);
   cvmSet(pca_data,2,1,6);
   cvmSet(pca_data,0,2,0);
   cvmSet(pca_data,1,2,3);
   cvmSet(pca_data,2,2,0);


   CvMat* mean_vector = cvCreateMat(1,3,CV_32FC1);
   CvMat* eigen_values = cvCreateMat(1,3,CV_32FC1);
   CvMat* eigen_vectors = cvCreateMat(3,3,CV_32FC1);

 

  

  cvCalcPCA(pca_data,mean_vector,eigen_values,eigen_vectors,CV_PCA_DATA_AS_

                                                                                                                ROW);

Posted by sukay

댓글을 달아 주세요