반응형
안녕하세요
요즘 하루에 2개 이상씩 포스팅하고 있네요ㅎㅎ
얼른 목표로 하고 있는 이미지 기법등을 공부해서 C#으로 이미지 판독 프로그램이나
OCR 같은 지능형 프로그램을 만들어보는게 목표인데
아직 OpenCvSharp만 디딥다 파고 있습니다ㅎㅎ
기본 정보를 모으고 그걸 구현해보고 오류 수정하고 매일 이걸 반복하고 있으니 이젠 제가
블로거인지...프로그래머인지...사진편집가인지 헷갈리네요ㅎㅎㅎ
아무튼 OpenCv 포스팅을 이어서 하겠습니다
이번 포스팅은 이미지 와핑이라는 것인데요
와핑이라는게 이미지를 왜곡시키는 기능인데요
이미지를 찌그러 트리거나 회전시키거나 뭐 이런 기능을 다 와핑이라고 표현하는거 같습니다
그 와핑이라는것을 C# OpenCvSharp를 이용해서 구현해 보도록 할께요
처음 오시느 분들은 앞 포스팅에서 라이브러리 등록부터 보시고 오시면 좋을거 같습니다
https://codingman.tistory.com/49
[디자인]
- 메뉴에 와핑 버튼을 생성해줍니다
- 와핑 버튼에 아래 같이 클릭 이벤트를 생성해 주구요
- 늘 반복적으로 하는 행위라서 간단하게 넘어가겠습니다
- 클릭 이벤트 지점에 다음과 같이 코딩 합니다
private void 와핑ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (src == null) return;
using (perspect Pp = new perspect())
using (IplImage temp = Pp.Perspective(src))
{
result = temp.Clone();
}
pictureBoxIpl2.ImageIpl = result;
}
- 그 다음 이미지를 와핑 시키기 위해서 사용할 클래스를 생성해줍니다
- 그리고 생성된 클래스 파일에 아래와 같이 코딩해 줍니다
using System;
using System.Collections.Generic;
using System.Text;
using OpenCvSharp;
namespace OpenCV_V1
{
class perspect : IDisposable
{
IplImage Pp;
public IplImage Perspective(IplImage srcImg)
{
// cvGetPerspectiveTransform + cvWarpPerspective
// 화상상의 4점에 대응하는 투시 투영 변환 행렬을 계산해, 그 행렬을 이용해 화상 전체의 투시 투영 변환을 실시한다.
// (1) 화상을 읽어들여, 출력용 화상 영역의 확보를 행한다
using (IplImage dstImg = srcImg.Clone())
{
// (2) 사각형의 변환전과 변환 후의 대응하는 정점을 각각 세트 해
// cvWarpPerspective를 이용해 투시 투영 변환 행렬을 요구한다
CvPoint2D32f[] srcPnt = new CvPoint2D32f[4];
CvPoint2D32f[] dstPnt = new CvPoint2D32f[4];
srcPnt[0] = new CvPoint2D32f(150.0f, 150.0f);
srcPnt[1] = new CvPoint2D32f(150.0f, 300.0f);
srcPnt[2] = new CvPoint2D32f(350.0f, 300.0f);
srcPnt[3] = new CvPoint2D32f(350.0f, 150.0f);
dstPnt[0] = new CvPoint2D32f(200.0f, 200.0f);
dstPnt[1] = new CvPoint2D32f(150.0f, 300.0f);
dstPnt[2] = new CvPoint2D32f(350.0f, 300.0f);
dstPnt[3] = new CvPoint2D32f(300.0f, 200.0f);
using (CvMat mapMatrix = Cv.GetPerspectiveTransform(srcPnt, dstPnt))
{
// (3) 지정된 아핀 행렬에 의해, cvWarpAffine를 이용해 화상을 회전시킨다
Cv.WarpPerspective(srcImg, dstImg, mapMatrix, Interpolation.Linear | Interpolation.FillOutliers, CvScalar.ScalarAll(100));
Pp = dstImg.Clone();
return Pp;
}
}
}
public void Dispose()
{
if (Pp != null) Cv.ReleaseImage(Pp);
}
}
}
- 그런 다음 이미지를 불러오고 와핑 시키면 다음과 같은 결과가 나타나게 됩니다
[결과 창]
반응형
'코딩정보 > OpenCv' 카테고리의 다른 글
[C#] OpenCvSharp 이미지 피부색검출하기 (0) | 2020.01.17 |
---|---|
[C#] OpenCvSharp 이미지 픽셀변환 시키기 (0) | 2020.01.16 |
[C#] OpenCvSharp 이미지 컨벡스헐 그리기 (0) | 2020.01.10 |
[C#] OpenCvSharp 포인트를 찾아 영역 지정 하기 (0) | 2020.01.09 |
[C#] OpenCvSharp 이미지 사각, 원형 검출하기 (2) | 2020.01.09 |