영상을 특정 각도만큼 회전시키는 변환
OpenCV는 반시계 방향을 기본으로 사용
{x′=cosθ⋅x+sinθ⋅yy′=−sinθ⋅x+cosθ⋅y
[x′y′]=[cosθ−sinθsinθcosθ00]⎣⎢⎡xy1⎦⎥⎤
회전 변환과 역방향 매핑
회전 변환도 역방향 매핑으로 구현해야 빈 픽셀이 발생하지 않음
[xy]=[cosθ−sinθsinθcosθ]−1[x′y′]=[cosθsinθ−sinθcosθ][x′y′]
보간법 선택 가능
영상의 회전 변환 행렬 구하기
center : 회전 중심 좌표
angle : 회전 각도
scale : 회전 후 확대 비율
return : 2x3 double (CV_64F) 행렬
[α−ββα(1−α)⋅center.x−β⋅center.yβ⋅center.x+(1−α)⋅center.y]
{α=scale⋅cos(angle)β=scale⋅sin(angle)
Mat getRotationMatrix2D(Point2f center, double angle, double scale);
src : 입력 영상
dst : 출력 영상
M : 2x3 어파인 변환 행렬
dsize : 결과 영상의 크기
flags : 보간법 선택
borderMode : 가장자리 픽셀 처리 방식
borderValue : BORDER_CONSTANT 모드 사용 시 사용할 픽셀 값
void warpAffine(InputArray src,
OutputArray dst,
InputArray M,
Size dsize,
int flags = INTER_LINEAR,
int borderMode = BORDER_CONSTANT,
const Scalar& borderValue = Scalar());
rotate
이동, 크기, 회전 변환 조합
이동 변환 → 크기 변환 → 회전 변환
[x′y′]=[cosθ−sinθsinθcosθ][sx00sy]([xy]+[ab])
동차 좌표계
homogenous coordinates
차원의 좌표를 1차원 증가시켜 표현하는 방법
이동 변환 → 크기 변환 → 회전 변환
⎣⎢⎡x′y′1⎦⎥⎤=⎣⎢⎡cosθ−sinθ0sinθcosθ0001⎦⎥⎤⎣⎢⎡sx000sy0001⎦⎥⎤⎣⎢⎡100010ab1⎦⎥⎤⎣⎢⎡xy1⎦⎥⎤
=⎣⎢⎡a11a210a12a220a13a231⎦⎥⎤⎣⎢⎡xy1⎦⎥⎤
대칭 변환
영상의 대칭 변환(flip, reflection)
영상의 상하 대칭, 좌우 대칭, 원점 대칭
src : 입력 영상
dst : 출력 영상
flipCode : 대칭 방향 지정
void flip(InputArray src, OutputArray dst, int flipCode);