반응형

안녕하세요

 

이번 시간에는 OpenCv를 통한 이미지 회전, 축소, 확대 기능을 만들어 볼려고 합니다

 

해당 기능을 구현하기 위해서 OpenCvSharp 라이브러리 등록부터 알아봐야 하는데 

 

아래 링크를 통해 확인해 보시기 바랍니다

 

https://codingman.tistory.com/49

 

[C#]OpenCvSharp 라이브러리 사용하기 #1

안녕하세요 저번 포스팅에 C#으로 OpenCvSharp 라이브러리를 등록하여 구현하는 포스팅을 준비하던중에 OpenCv 3,4 버전에서 오류가 발생하는 문제가 있다는 얘길 듣고 부랴부랴 포스팅 내용을 검토해봤는데 역시..

codingman.tistory.com

 

그러면 해당 기능을 사용하기 위한 메뉴 등록부터 진행 하겠습니다

 

[디자인]

  - 다음과 같이 Menu에 이미지처리 -> 회전, 확대, 축소 버튼을 만들어 주세요

 

  - 각각의 버튼에 클릭이벤트를 생성해 주세요

    (이벤트 생성 방법은 여러차례 포스팅하였으므로 생략하도록 할께요)

 

[Source Code]

-회전 클릭 이벤트

        private void 회전ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            using (geometry Go = new geometry())
            using (IplImage temp = Go.Affine(src))
            {
                result = temp.Clone();

            }
            pictureBoxIpl2.ImageIpl = result;

        }

 - 확대 클릭 이벤트

        private void 확대ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            using (geometry Go = new geometry())
            using (IplImage temp = Go.MyPyrUp(src))
            {
                result = temp.Clone();

            }
            pictureBoxIpl2.ImageIpl = result;

        }

 

- 축소 클릭 이벤트

        private void 축소ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            using (geometry Go = new geometry())
            using (IplImage temp = Go.MyPyrDown(src))
            {
                result = temp.Clone();

            }
            pictureBoxIpl2.ImageIpl = result;

        }

 

[클래스 생성]

- 이미지처리를 위한 전용 클래스 생성

 

- 클래스명은 geometry.cs로 지정하였습니다

  (클래스명은 굳이 똑같이 하지 않으셔도 됩니다)

 

 

[Source Code]

using System;
using System.Collections.Generic;
using System.Text;
using OpenCvSharp;

namespace OpenCV_V1
{
    class geometry : IDisposable
    {
        IplImage geo;

        #region Affine 변환
        //어파인 변환
        public IplImage Affine(IplImage src)
        {
            // cvGetAffineTransform + cvWarpAffine
            // 화상상의 3점에 대응하는 Affine 변환 행렬을 계산, 그 행렬을 이용하여 화상 전체의 Affine 변환을 실시한다.

            // (1) 화상을 읽어들이고, 출력용 화상의 메모리를 확보한다
            using (IplImage srcImg = src.Clone())
            using (IplImage dstImg = srcImg.Clone())
            {
                // (2) 삼각형의 회전전과 회전 후의 대응하는 정점을 각각 세트 해  
                //    cvGetAffineTransform를 이용해 Affine 행렬을 구한다  
                CvPoint2D32f[] srcPnt = new CvPoint2D32f[3];
                CvPoint2D32f[] dstPnt = new CvPoint2D32f[3];
                srcPnt[0] = new CvPoint2D32f(200.0f, 200.0f);
                srcPnt[1] = new CvPoint2D32f(250.0f, 200.0f);
                srcPnt[2] = new CvPoint2D32f(200.0f, 100.0f);
                dstPnt[0] = new CvPoint2D32f(300.0f, 100.0f);
                dstPnt[1] = new CvPoint2D32f(300.0f, 50.0f);
                dstPnt[2] = new CvPoint2D32f(200.0f, 100.0f);
                using (CvMat mapMatrix = Cv.GetAffineTransform(srcPnt, dstPnt))
                {
                    // (3) 지정된 어파인 행렬에 의해, cvWarpAffine를 사용해 화상을 회전시킨다
                    Cv.WarpAffine(srcImg, dstImg, mapMatrix, Interpolation.Linear | Interpolation.FillOutliers, CvScalar.ScalarAll(0));

                    geo = dstImg.Clone();

                }
            }
            return geo;
        }
        #endregion

        #region PyrUpDown



        //이미지의 확대
        public IplImage MyPyrUp(IplImage src)
        {
            using (IplImage srcImg = src.Clone())
            using (IplImage dstImg = new IplImage(srcImg.Width * 2, srcImg.Height * 2, srcImg.Depth, srcImg.NChannels))
            {
                // (1) 입력 화상에 대한 화상 피라미드를 구성

                Cv.PyrUp(srcImg, dstImg, CvFilter.Gaussian5x5);
                geo = dstImg.Clone();

            }
            return geo;
        }



        //이미지의 축소

        public IplImage MyPyrDown(IplImage src)
        {
            using (IplImage srcImg = src.Clone())
            using (IplImage dstImg = new IplImage(srcImg.Width / 2, srcImg.Height / 2, srcImg.Depth, srcImg.NChannels))
            {
                // (1) 입력 화상에 대한 화상 피라미드를 구성
                Cv.PyrDown(srcImg, dstImg, CvFilter.Gaussian5x5);
                geo = dstImg.Clone();

            }
            return geo;
        }

        #endregion 

        public void Dispose()
        {
            if (geo != null) geo.Dispose();
        }
    }
}
 

[결과 창]

- 이미지 회전

 

- 이미지 축소

 

-이미지 확대

 

반응형

+ Recent posts