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);
이미지를 출력 합니다.
결과는 아래와 같습니다.
왼쪽이 원본이미지 이며 오른쪽이 회전변환된 이미지 입니다.
'영상처리' 카테고리의 다른 글
엣지 기반 이미지 패턴매칭(Edge based pattern matching) 프로그램 기법 소개(OpenCV 활용) (0) | 2022.04.17 |
---|---|
opencv를 활용한 이미지 외곽선 검출 FindContours 함수 활용 (0) | 2022.02.17 |
open cv를 활용한 이미지 패턴 매칭 구현방법 (0) | 2022.02.13 |
OpenCvShap 프로젝트 만들기(C# 활용) (0) | 2021.02.02 |
OpenCV 이진화 처리 프로그램 (0) | 2020.08.12 |
댓글