C#/C# OpenCV/

C# OpenCV 3-1. 대칭 & 회전

2019. 10. 28.

Flip & Rotate

Flip 이미지를 대칭시킬때 사용

Rotate 이미지를 회전시킬때 사용

 

Example Code

using System;
using System.Windows.Forms;
using OpenCvSharp;

namespace fliptest
{
    public partial class Form1 : Form
    {
        Mat src;        

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            src = new Mat("image.jpg");
            pictureBox1.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(src);
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            Mat dst = new Mat(src.Size(), MatType.CV_8UC3);

            Cv2.Flip(src, dst, FlipMode.X);
            Cv2.ImShow("X축", dst);

            Cv2.Flip(src, dst, FlipMode.Y);
            Cv2.ImShow("Y축", dst);

            Cv2.Flip(src, dst, FlipMode.XY);
            Cv2.ImShow("XY축", dst);

            Cv2.WaitKey(0);
            Cv2.DestroyAllWindows();
        }

        public Mat Rotate(Mat src, int angle)
        {
            Mat rotate = new Mat(src.Size(), MatType.CV_8UC3);
            Mat matrix = Cv2.GetRotationMatrix2D(new Point2f(src.Width / 2, src.Height / 2), angle, 1);
            Cv2.WarpAffine(src, rotate, matrix, src.Size(), InterpolationFlags.Linear);
            return rotate;
        }

        private void Button2_Click(object sender, EventArgs e)
        {
            Mat dst = new Mat(src.Size(), MatType.CV_8UC3);

            dst = Rotate(src, 60);
            Cv2.ImShow("60도", dst);
            
            dst = Rotate(src, 90);
            Cv2.ImShow("90도", dst);

            dst = Rotate(src, 120);
            Cv2.ImShow("120도", dst);

            Cv2.WaitKey(0);
            Cv2.DestroyAllWindows();
        }        
    }
}

 

Explain Code

		private void Button1_Click(object sender, EventArgs e)
        {
            Mat dst = new Mat(src.Size(), MatType.CV_8UC3);

            Cv2.Flip(src, dst, FlipMode.X);
            Cv2.ImShow("X축", dst);

            Cv2.Flip(src, dst, FlipMode.Y);
            Cv2.ImShow("Y축", dst);

            Cv2.Flip(src, dst, FlipMode.XY);
            Cv2.ImShow("XY축", dst);

            Cv2.WaitKey(0);
            Cv2.DestroyAllWindows();
        }
        

Flip을 이용해 X, Y, XY축으로 대칭

 

		public Mat Rotate(Mat src, int angle)
        {
            Mat rotate = new Mat(src.Size(), MatType.CV_8UC3);
            Mat matrix = Cv2.GetRotationMatrix2D(new Point2f(src.Width / 2, src.Height / 2), angle, 1);
            Cv2.WarpAffine(src, rotate, matrix, src.Size(), InterpolationFlags.Linear);
            return rotate;
        }
        

회전함수 생성

Mat rotate 리턴시킬 값

Mat matrix 회전 중심점과 회전시킬 각도 설정

    Cv2.GetRotationMatrix2D(point2f center, double angle, double scale)

    point2f center 중심점으로 설정할 좌표, double angel 회전시킬 각도, double scale 확대or축소할 비율

WarpAffine(src, rotate, matrix, size, flags) 원본이미지, 결과이미지, 변형시킬배열, 결과사이즈, 이미지보간방법

 
		private void Button2_Click(object sender, EventArgs e)
        {
            Mat dst = new Mat(src.Size(), MatType.CV_8UC3);

            dst = Rotate(src, 60);
            Cv2.ImShow("60도", dst);
            
            dst = Rotate(src, 90);
            Cv2.ImShow("90도", dst);

            dst = Rotate(src, 120);
            Cv2.ImShow("120도", dst);

            Cv2.WaitKey(0);
            Cv2.DestroyAllWindows();
        }   
        

위에서 생성한 함수를 이용

원하는 각도로 회전가능

 

Result

대칭

회전