Computer Vision2009. 3. 10. 19:14

(주) 글을 읽기 전에
이 글은 저와 같은 OpenCV초보자를 위해서 정리하는 것입니다.
전문가시라면 굳이 읽을 필요가 없습니다.
공부하면서 정리하는 글이라서 서툰 부분이 많이많이 보입니다.


OpenCV로 하는 Rotate를 해보도록 하겠습니다.

1) 공간 확보와 정리
먼저 생성될 공간을 확보해야 하는데요
IplImage *image = cvCreateImage(cvSize(width, height), depth, nChannels);
size는 말 그대로 창의 크기를 말합니다.
depth는 영상을 표현하는 정보의 내용을 의미합니다.
 • IPL_DEPTH_1U : 1비트 양의 정수영상
 • IPL_DEPTH_8U : 8비트 양의 정수영상
 • IPL_DEPTH_16U : 16비트 양의 정수영상
 • IPL_DEPTH_32U : 32비트 양의 정수영상

이 됩니다.

nChannels는 색의 종류를 의미하는 것으로 1이면 흑백 3이면 컬러가 됩니다.

사용을 다 하면 정리해줘야 합니다.
물론 프로그램을 빠져나갈때 정리를 하지 않아도 O/S가 뒤져서 찾아가는 경우도 있지만
원칙은 사용한 프로그램이 다시 그것을 O/S에 돌려줘야 한다는 것입니다.

cvReleaseImage(&image);

를 하여서 정리합니다.

(2) cvPoint2D32f
 2차원 좌표 상에서 32비트 플로팅 포인트로 x와 y좌표를 설정합니다.


(3) WrapAffine
affine transform을 수행합니다.
인자는 다음과 같습니다.

void cvWarpAffine(
 const CvArr* src,  당연히 원본 이미지
 CvArr* dst,    이것도 당연히 결과를 받아내는 이미지
 const CvMat* map_matrix, affine transform을 하는 매트릭스
    int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS, 이것은 인터폴레이션을 선택
    CvScalar fillval=cvScalarAll(0)     채워지는 값
);

결과 그림은 아래와 같습니다.

사용자 삽입 이미지

끝으로 아래 사이트에 가시면 몇가지 다른 예제를 볼 수 있습니다.
공부에 참고하시기 바랍니다.
http://dasl.mem.drexel.edu/~noahKuntz/openCVTut5.html


아래 코드는 완성된 버전입니다.



 

 #include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>

#include <opencv/cv.h>
#include <opencv/highgui.h>



int main(int argc , char * argv[] ){

    // 이미지 읽기
  IplImage *imgA = cvLoadImage( "4390m.jpg", 1);
  // 대상 이미지 확정
  IplImage *imgB = cvCreateImage( cvGetSize( imgA), IPL_DEPTH_8U, 3);

  const double angle  = 80.0; // 회전 각도를 설정
  const double scale  = 0.8;  // 확대 크기를 설정
 
  // 중심 축은 가운데로...
  CvPoint2D32f center = cvPoint2D32f( imgA->width/2.0, imgA->height/2.0);//회전중심설정
 
  // 그에 따른 매트릭스 만들기
  CvMat *rot_mat = cvCreateMat( 2, 3, CV_32FC1);

  //매트릭스 계산
  cv2DRotationMatrix(
       center, // Source Image의 센터를 정한다.
       angle,  // 이것은 각도 + 값은 시계 반대 반대 방향을 의미한다.
       scale,  // 이미지 크기...
       rot_mat) // 결과를 저장하는 매트릭스 이다.
    ; // 메트릭스 변환


  // affine transform
  cvWarpAffine( imgA,
  imgB,
  rot_mat,
  CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,
  cvScalarAll(0)); // 선형보간
  cvSaveImage( "image_result8.bmp", imgB);

  cvNamedWindow("Rotated Image",0);
  cvShowImage("Rotated Image",(CvArr*)imgB);
  cvWaitKey(0);
  cvDestroyWindow("Roated Image");

  cvReleaseImage( &imgA );
  cvReleaseImage( &imgB );
  cvReleaseMat( &rot_mat);
  return 0;
}

'Computer Vision' 카테고리의 다른 글

OpenCV - Image Mask  (0) 2009.03.16
OpenCV - Extract  (2) 2009.03.12
Rob Hess의 SIFT [5]  (2) 2009.03.02
Rob Hess의 SIFT [4]  (0) 2009.02.25
Rob Hess의 SIFT [3]  (2) 2009.02.23
Posted by GUNDAM_IM