본문 바로가기

[ 프로그래밍 ]/강좌

cvWarpPerspective() 사용 방법

1. 와핑

와핑이라는 말의 의미는 휘게하다, 왜곡시키다 라는 의미로 해석할 수 있지만,
영상처리에서는 회전 보정이나 찌그러진 이미지의 정규화를 위하여 사용한다. 

2. OpenCV 제공 함수를 이용한 와핑 (역순으로 설명)

OpenCV 에서 이미지의 와핑을 위해 제공하는 함수는 cvWarpPerspective() 이며,
이는 원본 이미지를 미리 구해진 변환 매트릭스를 이용하여 타겟 이미지를 생성하는 함수이다.
void cvWarpPerspective (const CvArr *src, CvArr *dst, const CvMat *map_matrix, int flags = 1+8, CvScalar fillval = cvScalarAll(0))
첫 번 째 변수 src는 IplImage* 타입의 원본 이미지, 두 번 째 변수 dst는 IplImage* 타입의 타겟 이미지.
세 번 째 변수 CvMat는 미리 계산해 둔 변환행렬이다. (두 번 째 변수는 미리 초기화 해 두어야 한다.)

나머지 변수는 변환 기법과 변환시 빈 공간을 채울 색을 지정하는 것으로,
변환기법은 CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS
채울 색상은 cvScarlarAll(0)의 기본 값을 사용하면 된다.

변환행렬을 구하는 함수는 cvGetPerspectiveTransform()이며,
이는 4개의 점으로 이루어진 사각형 내의 이미지를 새로운 4개의 점으로 이루어진 사각형으로 변환할 수 있도록
행렬(매트릭스)을 생성하여 준다.
CvMat* cvGetPerspectiveTransform (const CvPoint2D32f *src, const CvPoint2D32f *dst, CvMat *map_matrix)

CvPoint2D32f 형으로 두 개의 배열 ptSource[4], ptPrespective[4]를 선언하고, 각각에 좌측상단점(TOPLEFT), 우측상단점(TOPRIGHT), 우측하단점(BOTTOMRIGHT), 좌측하단점(BOTTOMLEFT) 순으로 값을 넣는다.

이런 과정을 거치면 변환행렬인 map_matrix를 구할 수 있다.

다음은 간단한 변환 예제이다.

CvPoint2D32f ptSource[4], ptPrespective[4];

// 변환할 네 점의 좌표는 앞에서 여러가지 방법으로 구해진 점들을 대입하는 형태로 구성하였다.
for( i=0; i < 4; i++ )  ptSource[i] = cvPoint2D32f( ptSource[i].x, ptSource[i].y ); 

// 변환될 네 점의 좌표는 생성할 이미지의 꼭지점 좌표로 설정하였다.
ptPrespective[TOPLEFT]  = cvPoint2D32f(0, 0);
ptPrespective[TOPRIGHT]  = cvPoint2D32f(dst->width, 0);
ptPrespective[BOTTOMRIGHT] = cvPoint2D32f(dst->width, dst->height);
ptPrespective[BOTTOMLEFT] = cvPoint2D32f(0, dst->height);


float newm[9];           
CvMat mat = cvMat( 3, 3, CV_32F, newm );  // 변환행렬 초기화

cvWarpPerspectiveQMatrix(ptSource, ptPrespective, &mat);  // 변환행렬 구하기

// 이미지 와핑
cvWarpPerspective(src, dst, &mat,CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS, cvScalarAll(0) );