회전변환과 기하학적 변환의 조합

전종원·2022년 10월 31일
0

1. 영상의 회전변환

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

OpenCV 회전변환행렬 구하는 메서드

  • 90, 270, 180도 등 특수각 한서 작동
Mat getRotationMatrix2D(Point2f center, double angle, double scale);
  • center: 회전중심좌표
  • angle: 회전각도(반시계), 음수는 시계방향
  • scale: 회전 후 확대 비율
  • 반환값: 2x3 double(CV_64F) 행렬

OpenCV 회전변환 메서드

void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize,
				int flags = INTER_LINEAR, int borderMode = BORDER_CONSTANT,
                const Scalar& borderValue = Scalar());
  • src: 입력영상
  • dst: 출력영상
  • M: 2x3 어파인 변환행렬. CV_32F 또는 CV_64F
  • dsize: 결과 영상 크기
  • flags: 보간법 선택
  • borderMode: 가장자리 픽셀 처리방식
  • borderValue: BOREDER_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);
	on_rotate(0, (void*)&src);

	waitKey();
}

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

	imshow("dst", dst);
}

2. 기하학적 변환의 조합과 동차 좌표계

크기변환과 회전변환 조합

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

동차 좌표계(homogenous coordinates)

  • 차원의 좌표를 1차원 증가시켜 표현하는 방법
    • (x,y) -> (x, y, 1)

3. 대칭변환

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

0개의 댓글