반응형
안녕하세요
저번 포스팅에서 점멸을 포함하는 사각형 그리기에 대해 포스팅 했었는데요
https://codingman.tistory.com/67
이번 포스팅에서는 형태와 상관없이 외곽 점들을 연결시켜 영역을 지정하는것을 해볼려고 합니다
OpenCvSharp 함수 중에 ConvexHull2 이라는 함수를 사용해서 구현을 해볼려고 합니다
이번 포스팅 역시 OpenCvSharp를 이어서 진행 되니 처음 시작 하시는 분의 경우 앞 포스팅을 확인하시기
바랍니다
https://codingman.tistory.com/49
처음에 할 것을 역시 버튼 만들기 겠죠?
[디자인]
- Menu에서 다음과 같이 메뉴를 등록시켜 주세요
- 다음은 컨벡스 헐이라는 메뉴를 클릭 했을때 동작 할 수 있도록 클릭 이벤트를 생성 합니다
- 클릭 이벤트를 생성한뒤 해당 이벤트 발생 지점에 다음과 같으 코딩을 해줍니다
private void 컨벡스헐ToolStripMenuItem_Click(object sender, EventArgs e)
{
CvWindow wind = new CvWindow("결과창");
convex Cx = new convex();
Cx.ConvexHull(this.pictureBoxIpl1, this.pictureBoxIpl2, wind);
}
- 랜덤 점 생성과 생성된 점들의 외곽을 구하고 그 외곽을 연결시키는 기능을 실행할 클래스를 생성합니다
(클래스 파일 생성은 첫 포스팅에서 확인하세요)
- 생성된 클래스 파일에 다음과 같은 기능을 할 코딩 소스를 넣어 짭니다
(오류 수정과 테스트로 인한 주석이 존재하니 양해 바랍니다)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;
using OpenCvSharp.UserInterface;
namespace OpenCV_V1
{
class convex
{
IplImage _dst;
public void ConvexHull(PictureBoxIpl p1, PictureBoxIpl p2, CvWindow wind)
{
IplImage img = Cv.CreateImage(new CvSize(500, 500), BitDepth.U8, 3);
Random rand = new Random();
int count = rand.Next() % 100 + 1;
//임의의 점 생성
CvPoint[] ptseq = new CvPoint[count];
for (int i = 0; i < count; i++)
{
ptseq[i] = new CvPoint
{
X = rand.Next() % (img.Width),
Y = rand.Next() % (img.Height)
};
/*
CvPoint pt = new CvPoint
{
X = rand.Next() % (img.Width / 2) + img.Width / 4,
Y = rand.Next() % (img.Height / 2) + img.Height / 4
};
Cv.SeqPush<CvPoint>(ptseq, pt);
*/
}
// 점 그리기
Cv.Zero(img);
foreach(CvPoint pt in ptseq)
{
Cv.Circle(img, pt, 2, new CvColor(255, 0, 0), -1);
}
/*
for (int i = 0; i < count; i++)
{
CvPoint pt = Cv.GetSeqElem<CvPoint>(ptseq, i).Value;
Cv.Circle(img, pt, 2, new CvColor(255, 0, 0), -1);
}
*/
//임의의 점 그린 사진 보여주기
p1.ImageIpl = img;
_dst = img.Clone();
// Hull 찾기
CvPoint[] hull;
Cv.ConvexHull2(ptseq, out hull, ConvexHullOrientation.Clockwise);
//Hull 그리기
CvPoint pt0 = hull[hull.Length - 1];
foreach (CvPoint pt in hull)
{
Cv.Line(_dst, pt0, pt, CvColor.Green, 3, LineType.AntiAlias);
pt0 = pt;
}
/*
for (int i = 0; i < hull.Total; i++)
{
CvPoint pt = Cv.GetSeqElem<Pointer<CvPoint>>(hull, i).Value.Entity; // CvPoint pt = **CV_GET_SEQ_ELEM( CvPoint*, hull, i );
Cv.Line(img, pt0, pt, new CvColor(0, 255, 0));
pt0 = pt;
}
*/
p2.ImageIpl = _dst;
wind.Image = _dst;
img.Dispose();
}
}
}
- 필드 후 실행한 결과 화면 입니다
반응형
'코딩정보 > OpenCv' 카테고리의 다른 글
[C#] OpenCvSharp 이미지 픽셀변환 시키기 (0) | 2020.01.16 |
---|---|
[C#] OpenCvSharp 이미지 와핑 시키기 (0) | 2020.01.10 |
[C#] OpenCvSharp 포인트를 찾아 영역 지정 하기 (0) | 2020.01.09 |
[C#] OpenCvSharp 이미지 사각, 원형 검출하기 (2) | 2020.01.09 |
[C#] OpenCvSharp 이미지 컨투어(윤곽선) 찾기 (0) | 2020.01.08 |