반응형
안녕하세요
이번 시간에는 OpenCv를 통한 이미지 회전, 축소, 확대 기능을 만들어 볼려고 합니다
해당 기능을 구현하기 위해서 OpenCvSharp 라이브러리 등록부터 알아봐야 하는데
아래 링크를 통해 확인해 보시기 바랍니다
https://codingman.tistory.com/49
그러면 해당 기능을 사용하기 위한 메뉴 등록부터 진행 하겠습니다
[디자인]
- 다음과 같이 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();
}
}
}
[결과 창]
- 이미지 회전
- 이미지 축소
-이미지 확대
반응형
'코딩정보 > OpenCv' 카테고리의 다른 글
[C#] OpenCvSharp 이미지 직선 검출하기 (0) | 2020.01.06 |
---|---|
[C#] OpenCvSharp 이미지 코너 검출하기 (0) | 2020.01.06 |
[C#] OpenCvSharp 얼굴검출 기능 구현하기 (0) | 2019.12.30 |
[C#] OpenCvSharp 히스토그램 적용 하기 (0) | 2019.12.30 |
[C#] OpenChSharp 라플레스엣지 효과 주기 (0) | 2019.12.30 |