1. 회전 변환(Rotation transform):  영상을 특정 각도만큼 회전시키는 변환으로 Opencv 에서는 반시계방향을 기본으로 사용. theta 회전 시 반시계방향으로 theta만큼 회전

 1) 회전변환도 역방향 매핑으로 구현해야 빈 픽셀이 발생하지 않는다.

 2) 보간법 선택 가능.

 

2. 회전변환 시 rotate() [90, 270, 180 도 등 특수각 형태만 지원)  와  warpAffine 를 조합해 범용적인 회전변환이 가능하다

 1) 영상의 회전변환 행렬 구하는 함수

    Mat getRotationMatrix2D(Point2f center, double angle, double scale);

center: 회전중심 좌표 

angle <0 인 경우 시계방향으로 해당 각도만큼 회전

scale: 회전 후 확대비율

반환값: 2x3 double(CV_64F) 행렬 (==어파인변환행렬)

2) 어파인 함수

 

 void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags = INTER_LINEAR, int borderMode = BORDER_CONSTANT, const Scalar& borderValue = Scalar());

dst : src와 같은  타입의 출력영상

M: 2x3 어파인 변환 행렬, CV_32 또는 CV_64F.

dsize: 결과 영상의크기 ( Size()  로 타이핑 시 입력영상의 크기와 동일하게 나옴)

flags: 보간법선택

borderMode: 가장자리 픽셀 처리 방식 ( 영상 회전 시 비어있는 공간에 어떤 값을 설정할건가 처리 방식 의미)

borderValue: BORDER_CONSTANT 모드 사용 시 사용할 픽셀 값.     Scalar() == (0, 0, 0, 0) 으로 픽셀이 빈값으로 동작함,.

 

 

void flip(InputArray src, OutputArray dst, int flipCode);

flipCode: 대칭방향 지정

양수(+1): 좌우 대칭

0 : 상하대칭

음수(-1): 좌우 & 상하 대칭

 

 

 

 

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

using namespace std;
using namespace cv;


void on_rotate(int pos, void* data) {
	Mat src = *(Mat*)data;
	
	float degree = (float)pos;
	Point2f pt(src.cols / 2.f, src.rows / 2.f);
	Mat rot = getRotationMatrix2D(pt, degree, 1.0);

	Mat dst;
	//warpAffine(src, dst, rot, Size());  //src  : 512x512
	warpAffine(src, dst, rot, Size(700,700));
	imshow("dst", dst);
}

void TC1() {
	Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);

	if (src.empty()) {
		cerr << "Image laod failed!" << endl;
		return;
	}


	imshow("src", src);
	namedWindow("dst");
	createTrackbar("angle", "dst", 0, 360, on_rotate, (void*)&src);
	waitKey();
}

void TC2() { //이동변환, 크기변환, 회전변환 조합하기. 
	//1  크기변환 -> 회전변환


	//2 크기변환 -> 회전변환 -> 크기변환

	//3 이동변환 -> 크기변환

	//4 이동변환 -> 크기변환 -> 회전변환 


	/*덧셈 변환을 없애는 방법
	  ->동 차 좌표계(homogenous coordinates)
	  1) 차원의 좌표를 1차원 증가시켜 표현 하는 방법
	  2) eg. 2차원 (x, y) 좌표를 (x, y, 1) 로 표현
	  3) 이동, 크기 , 회전변환의 조합을 2x3 행렬 하나로 표현 가능

	  4)getRotationMatrix2D() 함수를 이용해 영상의 중앙 기준으로 회전을 할 수 있다.
	*/
}

void TC3() {
	//대칭변환 (flip, reflection)
	//영상의 상하대칭, 좌우대칭, 원점대칭

}
int main()
{
	//TC1();
	//TC2();
    TC3();
}

+ Recent posts