* 이미지 와핑(Warping)

 

  - 기하학적 변형(Geometric Transformation)의 한 종류

 

  - (x, y) 좌표의 픽셀을 (x', y') 좌표로 대응시키는 작업

 

* OpenCV의 이미지 와핑(Warping)

 

  - OpenCV에서도 와핑 함수가 구현이 돼있다. 좌표를 구하는 방식은 본인 몫

 

  - 구현 순서

    1. (x, y)에 해당하는 4점의 좌표를 지정 <- 코너 검출기 함께 사용하면 편할 것 같다

    2. (x', y')에 해당하는 4점의 좌표를 지정

    3. getPerspectiveTransform()함수를 사용하여 Transform Matrix를 구함

    4. warpPerspective()함수를 이용하여 실제 Warping

 

void cvWarpPerspective(const CvArr *src, CvArr *dst, const CvMat *map_matrix, int flags = 1+8, CvScalar fillval = cvScalarAll(0))

 

  - 첫번째 변수 src는 원본 이미지, 두번째 변수 dst는 타겟 이미지, 세번째 변수 CvMat는 미리 계산해둔 변환행렬

 

  - 두번째 변수는 미리 초기화 해두어야 한다.

 

  - 나머지 변수는 변환 기법과 변환시 빈 공간을 채울 색을 지정하는 것으로

 

  - 변환기법은 CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS 채울 색상은 cvScalarAll(0)의 기본값을 사용하면 된다.

 

-> 변환행렬을 구하는 함수는 cvGetPerspectiveTransform()

  - 4개의 점으로 이루어진 사각형 내의 이미지를 새로운 4개의 점으로 이루어진 사각형으로 변환할 수 있도록

    행렬(Matrix) 생성

 

CvMat* cvGetPerspectiveTransform(const CvPoint2D32f *src, const CvPoint2D32f *dst, CvMat *map_matrix)

 

  - CvPoint2D32f 형으로 두 개의 배열을 선언하고, 각각에 꼭짓점을 L.T, R.T, L.B, R.B 순으로 넣는다.

 

이미지를 불러와서 OpenCV로 구현을 해보았다.

코너 검출 함께 해서 할 수 있었는데 일단 확인을 하기 위해 쉽게 했음..

 


#include "stdafx.h"
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
 Mat img = imread("2.jpg");

 // Warping 전의 이미지 상의 좌표
 vector<Point2f> corners(4);
 corners[0] = Point2f(125, 292);
 corners[1] = Point2f(848, 193);
 corners[2] = Point2f(143, 780);
 corners[3] = Point2f(890, 810);

 Size warpSize(800, 800);
 
 Mat warpImg(warpSize, img.type());

 // Warping 후의 좌표
 vector<Point2f> warpCorners(4);
 warpCorners[0] = Point2f(0, 0);
 warpCorners[1] = Point2f(warpImg.cols, 0);
 warpCorners[2] = Point2f(0, warpImg.rows);
 warpCorners[3] = Point2f(warpImg.cols, warpImg.rows);

 // Transformation Matrix 구하기
 Mat trans = getPerspectiveTransform(corners, warpCorners);
 
 // Warping
 warpPerspective(img, warpImg, trans, warpSize);
 imshow("warpImg", warpImg);

 for (int i = 0; i < corners.size(); i++)
  circle(img, corners[i], 3, Scalar(255, 0, 0), 3);

 imshow("Image", img);
 waitKey(0);

 return 0;
}

>

 

 

 

출처]

http://m.blog.naver.com/pckbj123/100205803400

http://sigi1404.tistory.com/entry/%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%B3%B4%EC%A0%95-Warping

 

+ Recent posts