달력

112018  이전 다음

  •  
  •  
  •  
  •  
  • 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
  •  

'OpenCV'에 해당되는 글 3건

  1. 2011.04.04 Smooth (2)
  2. 2010.12.02 OpenCV IplImage
  3. 2010.11.30 OpenCV CvMat 관련 함수정리

Smooth

OpenCV 2011.04.04 06:17

출처 : http://www.newtypeunion.com/40?category=5

Smooth

OpenCV에서는 몇가지 방법으로 Smooth를 할 수 있게 하여 줍니다.

함수의 원형은 다음과 같습니다.

void cvSmooth( const CvArr* src, CvArr* dst,

               int smoothtype=CV_GAUSSIAN,

               int param1=3, int param2=0, double param3=0 );


smoothing 타입에 따라서 파라미터 인자의 역활이 바뀝니다.

요 부분만 알고 있으면 나머진 쉽습니다.

src

원본 이미지


dst

결과 이미지


smoothtype

smoothing 타입

  • CV_BLUR_NO_SCALE (simple blur with no scaling)
    • summation over a pixel param1×param2 neighborhood.
    • If the neighborhood size may vary, one may precompute integral image with cvIntegral function.
  • CV_BLUR (simple blur)
    • summation over a pixel param1×param2 neighborhood with subsequent scaling by 1/(param1param2).
  • CV_GAUSSIAN (gaussian blur)
    • convolving image with param1×param2 Gaussian kernel.
  • CV_MEDIAN (median blur)
    • finding median of param1×param1 neighborhood (i.e. the neighborhood is square).
  • CV_BILATERAL (bilateral filter)


param1

첫번째 인자

param2

두번째 인자

In case of simple scaled/non-scaled and Gaussian blur if param2 is zero, it is set to param1.

param3

         가우시안 방식일 경우 시그마를 넣어야 하지만,

이 파라미터가 0이면 커널 사이즈에서 자동으로 만들어진다.  수식은 아래와 같습니다.

              sigma = (n/2 - 1)*0.3 + 0.8,

                  where n=param1 for horizontal kernel,

                                                

                        n=param2 for vertical kernel.


  • Using standard sigma for small kernels (3×3 to 7×7) gives better speed.
  •       If param3 is not zero, while param1 and param2 are zeros, the kernel size is calculated from the sigma (to provide accurate enough operation).

보통의 시그마를 쓸 경우 그냥 좀 빨라진다. (차이는 ???)

         - 사실 차이라는게 크게 없는듯 합니다. 많이 하면 차이가 있겠지만 제 머쉰에서는 금방 결과가 나왔습니다.

         커널 사이즈를 안주고 (0으로 주고) 호출하면 역으로 시그마에서 커널 사이즈를 만듭니다

Posted by sukay
TAG Smooth

OpenCV IplImage

OpenCV 2010.12.02 02:41
제목 글씨 체가 맘에 안드는구나
Opencv IplImage 라고 적었는데 I랑 l이 구분이 안가네
네이버 개발자 폰트가 맘에 드는데.. 여기서 설정을 어떻게 하지 =_=

이번에 적을내용은 많이 사용하는 거지만
모르는 사람들에게 도움될까.. 해서

IplImage의 픽셀 하나하나에 접근하는 방법이다..
IplImage->ImageData[index]에 관련한 내용으로
매우간단?? 문제는 index...

IplImage에서 가로 width를 믿다간 큰일난다..
Gray영상이든, RGB영상이든 widthStep을 사용하도록 습관을 들이자
RGB는 3채널로 widthStep은 이 채널을 고려해서 가로의 길이를 계산해준다
0번 픽셀에 RGB 3가지 값이 있어서 다음 픽셀은 4번이 된다는 머 그런...

말보다 예제)  ↓↓↓

더보기

Posted by sukay
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