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 );
CV_PCA_DATA_AS_ROW
) or
CV_PCA_DATA_AS_COL
).
*결과 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);