영상의 회전 변환

  • 영상을 특정 각도 만큼 회전시키는 변환
  • OpenCV는 반시계 방향을 기본으로 사용

image

  • 회전 변환과 역방향 매핑
    • 회전 변환도 역방행 매핑으로 구현해야 빈 픽셀이 발생하지 않음

image

  • 영상의 회전 변환 행렬 구하기
    • 주어진 영상을 특정 각도로 회전하기 위해 필요한 2 x 3 Affine Transfer 행렬을 반환하는 함수
Mat getRotationMatrix2D(Point 2f center, double angle, double scale);
  • center : 회전 중심 좌표
  • angle : 반시계 방향으로 회전 각도(degree). (음수는 시계 방향)

  • scale : 회전 후 확대 비율
  • 반환값 : 2 x 3 double (CV_64F) Affine Transfer 행렬

image

void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags = INTER_LINEAR, int borderMode = Boder_CONSTANT, const Scalar& borderValue = Scalar());
  • src : 입력 영상
  • dst : 출력 영상
  • M : 2 x 3 어파인 변환 행렬(CV_32F or CV_64F)
  • dsize : 결과 영상 크기
  • flags : 보간법 선택
  • borderMode : 가장자리 픽셀 처리 방식
  • borderValue : BORDER_CONSTANT 모드 사용시 사용할 픽셀 값
#include <iostream>
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

void on_rotate(int pos, void* data);

int main()
{
	Mat src = imread("lenna.bmp");

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

	imshow("src", src);

	namedWindow("dst");
	createTrackbar("angle", "dst", 0, 360, on_rotate, (void*)&src); // 0부터 360까지 움직일 수 있는 Trackbar을 만듬
	on_rotate(0, (void*)&src);

	waitKey();
}

void on_rotate(int pos, void* data) // 트랙바의 값이 정수형 pos 로 넘어옴
{
	Mat src = *(Mat*)data;

	float degree = (float)pos;
	Point2f pt(src.cols / 2.f, src.rows / 2.f); // src 영상의 가운데 중심점 좌표 계산
	Mat rot = getRotationMatrix2D(pt, degree, 1.0); // degree 만큼 회전하고 확대/축소는 하지 않는 affine transfer 행렬을 rot에 저장

	Mat dst;
	warpAffine(src, dst, rot, Size()); // rot를 warpAffine 함수에 넣음

	imshow("dst", dst);
}

image

이동 변환, 크기 변환, 회전 변환 조합하기

  • 크기 변환 -> 회전 변환

image

  • 크기 변환 -> 회전 변환 -> 크기 변환
    • 앞의 변환 3개를 하나의 2 x 2 행렬로 표현할 수 있음

image

  • 이동 변환 -> 크기 변환

image

  • 이동 변환 -> 크기 변환 - > 회전 변환
    • 2x2 행렬 하나와 2x1 행렬 하나를 같이 사용

image

  • 동차 좌표계(homogenous coordinates)
    • 차원의 좌표를 1차원 증가시켜 표현하는 방법
    • 예를들어 2차원 (x,y) 좌표를 (x,y,1)로 표현
  • 동차 좌표계를 이용한 이동, 크기, 회전 변환 표현

image

  • 동차 좌표계를 이용한 이동 변환 -> 크기 변환 -> 회전 변환
    • 이동, 크기, 회전 변환의 조합을 2 x 3 행렬 하나로 표현할 수 있음
    • 이것을 앞에서 이야기한 affine transfer 행렬이라고 부름

imageimage

  • getRotationMatrix2D() 함수를 이용한 영상의 중앙 기준 회전
    • (-cx, -cy) 만큼 이동 변환 -> 회전 변환 -> (cx, cy) 만큼 이동 변환

image

image

영상의 대칭 변환

  • 영상의 상하 대칭, 좌우 대칭, 원점 대칭
void flip(InputArray src, OutputArray dst, int flipcode)
  • src : 입력 영상
  • dst : 출력 영상
  • flipCode : 대칭 방향 지정
    • 양수(+1) : 좌우 대칭
    • 0 : 상하 대칭
    • 음수(-1) : 좌우 & 상하 대칭