opencv를 활용한 이미지 회전(GetRotationMatrix2D 함수 활용)
본문 바로가기
영상처리

opencv를 활용한 이미지 회전(GetRotationMatrix2D 함수 활용)

by 124578 2022. 2. 15.

opencv를 활용한 이미지 회전에 대해 포스팅 합니다. 이미지 회전은 말그대로 이미지를 원하는 각도만큼 틀어서 출력을 해주는 기능입니다. 

 

opencv의 GetRotationMatrix2D함수를 통해 구현이 가능합니다. 이 함수의 인자에 대해 알아 봅니다.

 

Cv2.GetRotationMatrix2D(Point2f center, double angle, double scale);

 

중심점 Center 좌표, 각도, 스케일을 인자로 받고 있습니다. 각도 뿐만 아니라 스케일까지 변환이 가능한 함수 입니다. 이함수를 이용하여 코드로 구현하면 아래와 같습니다. C#으로 구현 되어 있습니다.

 

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OpenCvSharp;
using Point = OpenCvSharp.Point;


namespace ORB_Test
{
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Mat src = new Mat("image4.png"); 
            Mat dst = new Mat();

            int w = src.Width;
            int h = src.Height;

            double angle = 45.0;

            float cX = (float)w / 2;
            float cY = (float)h / 2;

            Mat M = Cv2.GetRotationMatrix2D(new Point2f(cX, cY), angle, 2.0);

            RotatedRect rrect;
            rrect = new RotatedRect(new Point2f(cX, cY), new OpenCvSharp.Size2f(w, h), Convert.ToSingle(angle));
            Rect rect = rrect.BoundingRect();

            // adjust transformation matrix
            M.At<double>(0, 2) += rect.Size.Width / 2.0 - src.Cols / 2.0;
            M.At<double>(1, 2) += rect.Size.Height / 2.0 - src.Rows / 2.0;

            Cv2.WarpAffine(src, dst, M, new OpenCvSharp.Size(rect.Size.Width, rect.Size.Height));
            Cv2.ImShow("source", src);
            Cv2.ImShow("result", dst);
        }

}

 

 

위에서 구현한 코드에 대한 설명 입니다. C# Winform으로 작성이 되었습니다. form이 로드될때 바로 실행됩니다.

 

  Mat src = new Mat("image4.png"); 
  Mat dst = new Mat();

 

입력 Mat와 출력 Mat를 선언합니다. 입력 Mat에는 회전변환할 이미지를 바로 로드 합니다.

 

  int w = src.Width;
  int h = src.Height;

 

입력 이미지의 가로,세로 크기를 할당 합니다.

 

    double angle = 45.0;

 

회전 변환 할 각도를 입력합니다.

 

   float cX = (float)w / 2;
   float cY = (float)h / 2;

 

입력 이미지의 중심점을 구합니다.

 

    Mat M = Cv2.GetRotationMatrix2D(new Point2f(cX, cY), angle, 2.0);

 

위에서 구한 값들을 이용하여 이미지를 회전변환하여 M에 저장합니다.

 

    RotatedRect rrect;
    rrect = new RotatedRect(new Point2f(cX, cY), new OpenCvSharp.Size2f(w, h), Convert.ToSingle(angle));
    Rect rect = rrect.BoundingRect();

    M.At<double>(0, 2) += rect.Size.Width / 2.0 - src.Cols / 2.0;
    M.At<double>(1, 2) += rect.Size.Height / 2.0 - src.Rows / 2.0;


회전된 이미지의 모든 부분을 표현하기 위해 이미지 영역을 변환해주는 사각형을 구현 합니다.


    Cv2.WarpAffine(src, dst, M, new OpenCvSharp.Size(rect.Size.Width, rect.Size.Height));

    Cv2.ImShow("source", src);
    Cv2.ImShow("result", dst);

 

이미지를 출력 합니다.

 

결과는 아래와 같습니다.

 

이미지 회전변환에 대한 결과 이미지

왼쪽이 원본이미지 이며 오른쪽이 회전변환된 이미지 입니다.

 

댓글


TOP

TEL. 02.1234.5678 / 경기 성남시 분당구 판교역로