[2023-04-24] 3. 영상의 회전 변환
영상의 회전 변환
- 영상을 특정 각도 만큼 회전시키는 변환
- OpenCV는 반시계 방향을 기본으로 사용
- 회전 변환과 역방향 매핑
- 회전 변환도 역방행 매핑으로 구현해야 빈 픽셀이 발생하지 않음
- 영상의 회전 변환 행렬 구하기
- 주어진 영상을 특정 각도로 회전하기 위해 필요한 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 행렬
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);
}
이동 변환, 크기 변환, 회전 변환 조합하기
- 크기 변환 -> 회전 변환
- 크기 변환 -> 회전 변환 -> 크기 변환
- 앞의 변환 3개를 하나의 2 x 2 행렬로 표현할 수 있음
- 이동 변환 -> 크기 변환
- 이동 변환 -> 크기 변환 - > 회전 변환
- 2x2 행렬 하나와 2x1 행렬 하나를 같이 사용
- 동차 좌표계(homogenous coordinates)
- 차원의 좌표를 1차원 증가시켜 표현하는 방법
- 예를들어 2차원 (x,y) 좌표를 (x,y,1)로 표현
- 동차 좌표계를 이용한 이동, 크기, 회전 변환 표현
- 동차 좌표계를 이용한 이동 변환 -> 크기 변환 -> 회전 변환
- 이동, 크기, 회전 변환의 조합을 2 x 3 행렬 하나로 표현할 수 있음
- 이것을 앞에서 이야기한 affine transfer 행렬이라고 부름
- getRotationMatrix2D() 함수를 이용한 영상의 중앙 기준 회전
- (-cx, -cy) 만큼 이동 변환 -> 회전 변환 -> (cx, cy) 만큼 이동 변환
영상의 대칭 변환
- 영상의 상하 대칭, 좌우 대칭, 원점 대칭
void flip(InputArray src, OutputArray dst, int flipcode)
- src : 입력 영상
- dst : 출력 영상
- flipCode : 대칭 방향 지정
- 양수(+1) : 좌우 대칭
- 0 : 상하 대칭
- 음수(-1) : 좌우 & 상하 대칭