C# OpenCV 강좌 : 제 20강 - 회전

C# OpenCV4 Rotation

C# OpenCV 강좌 : 제 20강 - 회전
[ C#-OpenCvSharp4 ] - 윤대희

이미지 회전(Image Rotation)


1

이미지 회전강체 변환(Rigid Transformation)유사 변환(Similarity Transformation)에 포함되는 변환 중 하나입니다.

이미지 회전은 두 가지의 변환에 포함되는데, 등방성(Isotropic) 크기 변환의 유/무로 변환의 방식의 결정됩니다.

강체 변환은 변환의 기준점으로부터 크기와 각도가 보존되는 변환입니다.

유사 변환은 강체 변환에 등방성 크기 변환이 추가된 변환입니다.

즉, 단순한 회전의 경우 강체 변환이며, 크기가 변환되면서 회전한다면 유사 변환이 됩니다.



2×2 회전 행렬(2×2 Rotation Matrix)


2

회전 행렬에는 크게 두 가지 종류가 있습니다.

좌표의 값을 회전시키는 좌표 회전 행렬과 좌표축을 회전시키는 좌표축 회전 행렬이 있습니다.

좌표 회전 행렬은 원점을 중심으로 좌푯값을 회전시켜 매핑합니다.

좌표축 회전 행렬은 원점을 중심으로 행렬 자체를 회전시켜 새로운 행렬의 값을 구성합니다.

두 회전 행렬 모두 원점을 중심으로 계산을 진행합니다.



2×3 회전 행렬(2×2 Rotation Matrix)


3

단순한 회전은 2×2 행렬을 활용해 원하는 결과를 쉽게 얻을 수 있습니다.

하지만, 임의의 중심점을 기반으로 회전을 수행하기 위해서는 아핀 변환(Affine Transformation)에 기반을 둔 회전 행렬을 활용해야 합니다.

2×3 회전 행렬을 사용할 경우 회전 축의 기준점 변경비율을 조정할 수 있다.

Center중심점의 좌표, scale비율, θ회전 각도를 의미합니다.

이 회전 행렬은 부동 소수점의 형태로 반환합니다.



Main Code


using System;
using OpenCvSharp;

namespace Project
{
    class Program
    {
        static void Main(string[] args)
        {
            Mat src = new Mat("wine.jpg");
            Mat dst = new Mat();

            Mat matrix = Cv2.GetRotationMatrix2D(new Point2f(src.Width / 2, src.Height / 2), 45.0, 1.0);
            Cv2.WarpAffine(src, dst, matrix, new Size(src.Width, src.Height));

            Cv2.ImShow("dst", dst);
            Cv2.WaitKey(0);
        }   
    }
}



Detailed Code


Mat src = new Mat("wine.jpg");
Mat dst = new Mat();


new Mat을 사용해 이미지를 src에 할당합니다.

연산 결과를 저장할 dst를 선언합니다.



Mat matrix = Cv2.GetRotationMatrix2D(new Point2f(src.Width / 2, src.Height / 2), 45.0, 1.0);

이미지를 회전시키기 위해, 회전 행렬을 생성합니다.

2×3 회전 행렬 생성 함수(Cv2.GetRotationMatrix2D)는 Mat 형식의 회전 행렬을 생성합니다.

Cv2.GetRotationMatrix2D(중심점의 좌표, 회전 각도, 비율)로 회전 행렬을 생성합니다.

중심점의 좌표를 기준으로 회전 각도만큼 회전하며, 비율만큼 크기를 변경합니다.



Cv2.WarpAffine(src, dst, matrix, new Size(src.Width, src.Height));

생성된 회전 행렬을 활용해 아핀 변환을 진행합니다.

아핀 변환 함수(Cv2.WarpAffine)는 회전 행렬을 사용해 회전된 이미지를 생성합니다.

Cv2.WarpAffine(원본 배열, 결과 배열, 행렬, 결과 배열의 크기)로 회전 행렬을 생성합니다.

결과 배열의 크기를 설정하는 이유는 회전 후, 원본 배열의 이미지 크기와 다를 수 있기 때문입니다.

만약, 45° 이미지를 회전한다면, 사각형 프레임 안에 포함시켜야 합니다.

그로 인해 이미지를 더 큰 공간에 포함하거나, 더 작은 공간에 포함할 수 있습니다.

그러므로, 결과 배열의 크기를 새로 할당하거나, 원본 배열의 크기와 동일하게 사용합니다.



Result


4


도움이 되셨다면 광고 클릭 부탁드립니다.


Book Image

책이 출간되었습니다!

C#과 파이썬을 활용한 OpenCV 4 프로그래밍

컴퓨터 비전 기초 이론부터 머신러닝을 활용한 영상 처리 프로젝트까지

  • C# OpenCvSharp4
  • Python OpenCV4
  • Using Tesseract
  • Using TensorFlow
  • Using Regular Expression
  • 윤대희 저 | 위키북스

    [yes24 바로가기] [알라딘 바로가기] [교보문고 바로가기]


    ⤧  Previous post C# OpenCV 강좌 : 제 19강 - 윤곽선 관련 함수 (2) ⤧  Next post C# OpenCV 강좌 : 제 21강 - 아핀 변환
    C#-OpenCvSharp4 Category