관리 메뉴

마틴블로그닷넷

cvWarpPerspective() 사용 방법 본문

[ 프로그래밍 ]/강좌

cvWarpPerspective() 사용 방법

K. Martin 2009.03.11 00:26

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) );

 

12 Comments
  • Favicon of http://unlimitcode.tistory.com UnlimiTCode 2009.03.15 20:31 신고 자동차 번호판 보정에 필수적인 이 함수를 내 라이브러리 함수로 쓰기 위해 양선형변환을 사용해서 직접 만들었다는...
    나는 왜 아직 OpenCV를 배척하는 것일까.. 아 씁쓸해~
  • Favicon of http://martinblog.net K. Martin 2009.03.17 19:55 신고 아직 한참 더 써봐야 겠지만,
    장점들이 많은 라이브러리인 것 같아요.
    형님 만들어두신 라이브러리랑 정 많이 들었는데,
    나름 독립선언하고 옛 프로그램들 손도 보고 그러고 있답니다.
    수도권 생활은 재미나신가욤?
  • Favicon of http://unlimitcode.tistory.com UnlimiTCode 2009.03.17 22:16 신고 몇몇 서울 사람들은 수원을 촌이라 하더구만..
    잘 지내고 있단다. 공부 열씸히 하믄서.. ㅋㅋ
  • Favicon of http://martinblog.net K. Martin 2009.03.18 19:11 신고 저는 부산사람이라,
    수원은 촌이라기 보다는 서울에 가깝죠. ㅋ
    그냥 수도권 정도 해둘랍니다. ^^
  • L.SH 2011.06.26 00:21 신고 원본영상에서 네점을 차례로 클릭하면 그네점을 트랜스폼하여 오른쪽에 출력하고싶은데 어케해야할까요?src랑 dst도 어떻게 정의하였는지좀 가르쳐주실수 있을까요?ㅜ
  • Favicon of http://martinblog.net K. Martin 2011.07.08 21:00 신고 OpenCV 강좌 中 마커에 동영상 삽입하기를 참고 바랍니다. http://martinblog.tistory.com/832
  • 박세호 2012.03.08 10:16 신고 마틴님 항상 좋은 강의 감사합니다.
    궁금한게 있어서 그런데요 TOPLEFT, TOPRIGHT, BOTTOMLEFT, BORROMRIGHT에는 크기가 4인 배열이니까 0~3의 숫자가 들어가야되지않나요? 그러면 어떻게 와핑하고싶은 꼭지점을 정하는지.... 제가 이번에 이 부분을 공부하고있는데 잘 몰라서 무작정 마틴님 소스를 복사붙여넣기 해서 위의 네개에 그냥 임의로 0부터 3까지 값을 넣어주고 돌렸는데 이미지가 다 주변색으로 변해서요 ㅠㅠ 답변 부탁드릴게요 ㅠㅠㅠ
  • Favicon of http://martinblog.net K. Martin 2012.03.08 18:04 신고 본문을 자세히 보시면,
    "CvPoint2D32f 형으로 두 개의 배열 ptSource[4], ptPrespective[4]를 선언하고, 각각에 좌측상단점(TOPLEFT), 우측상단점(TOPRIGHT), 우측하단점(BOTTOMRIGHT), 좌측하단점(BOTTOMLEFT) 순으로 값을 넣는다."
    라는 문구가 있습니다.
    참고 바랍니다.
  • 2012.12.19 18:39 비밀댓글입니다
  • 최용근 2013.05.15 16:12 신고 마틴님께 질문이 있어서 댓글을 남깁니다.
    현재 자동차번호판인식 프로그램을 개발중입니다.
    현재 번호판을 추출하는데까지 완성을 했지만,

    여러가지 제약조건으로 인한 차량번호판 때문에 정확도가 떨어지고 있습니다.

    문제점
    1. 그림자가 드리워진 번호판을 추출할때는 아에 전혀 다른 번호가 추출이 됩니다.
    2. 위와 같이 측면에서 번호판을 찍을 경우 번호판이 직사각형에서 마름모꼴로 변형되서
    레이블링으로 영역검출을 할때 검출을 실패해버립니다.

    이러한 문제점을 개선하기 위해서는 어떠한 방법을 이용해야할까요?
    2번 문제점은 위에 와핑을 사용하면 될까요??
  • 2015.07.14 13:44 비밀댓글입니다
  • 2015.07.14 13:44 비밀댓글입니다
댓글쓰기 폼