상위 목록: 하위 목록: 작성 날짜: 읽는 데 9 분 소요

윤곽선(Contour)

영상이나 이미지에서 라벨링된 이미지에서 윤곽선(컨투어)를 검출하기 위해 사용합니다.

원본(Source, src)은 영상이나 이미지를 사용합니다.



클래스 코드

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;
using OpenCvSharp.Blob;

namespace Project
{
    class OpenCV : IDisposable
    {  
        IplImage bin;
        IplImage blobcontour;
    
        public IplImage Binary(IplImage src)
        {
            bin = new IplImage(src.Size, BitDepth.U8, 1);
            Cv.CvtColor(src, bin, ColorConversion.BgrToGray);
            Cv.Threshold(bin, bin, 50, 255, ThresholdType.Binary);

            return bin;
        }
            
        public IplImage BlobContourImage(IplImage src)
        {
            blobcontour = new IplImage(src.Size, BitDepth.U8, 3);
            bin = this.Binary(src);

            CvBlobs blobs = new CvBlobs();
            blobs.Label(bin);

            foreach (KeyValuePair<int, CvBlob> item in blobs)
            {
                CvBlob b = item.Value;
                
                CvContourChainCode cc = b.Contour;
                cc.Render(blobcontour);

                CvContourPolygon polygon = cc.ConvertToPolygon();
                foreach (CvPoint p in polygon)
                {
                    blobcontour.Circle(p, 1, CvColor.Red, -1);
                }
            }

            return blobcontour;
        }
                   
        public void Dispose()
        {
            if (bin != null) Cv.ReleaseImage(bin);
            if (blobcontour != null) Cv.ReleaseImage(blobcontour);
        }
    }
}


세부 코드

using OpenCvSharp.Blob;

CvBlobs 함수를 사용하기 위해서는 네임스페이스using OpenCvSharp.Blob;를 선언해야 사용할 수 있습니다.


blobcontour  = new IplImage(src.Size, BitDepth.U8, 3);
bin = this.Binary(src);

bin라벨링에 사용될 이미지입니다.

이 이미지를 통하여 라벨링을 진행합니다. 라벨링은 이진화 이미지를 사용합니다.


CvBlobs blobs = new CvBlobs();
blobs.Label(bin);

CvBlobs blobs = new CvBlobs();을 이용하여 라벨링을 하기 위해 생성자를 만듭니다.

blobs.Label(bin);를 통하여 라벨링을 진행합니다. 이진화 이미지를 사용합니다.


foreach (KeyValuePair<int, CvBlob> item in blobs)
{
    CvBlob b = item.Value;

    CvContourChainCode cc = b.Contour;
    cc.Render(blobcontour);

    CvContourPolygon polygon = cc.ConvertToPolygon();
    foreach (CvPoint p in polygon)
    {
        blobcontour.Circle(p, 1, CvColor.Red, -1);
    }
}

foreach문을 이용하여 라벨링 정보를 확인할 수 있습니다.

item값을 이용하여 라벨링 정보를 확인 가능합니다.

CvContourChainCode를 이용하여 b에서 Contour값을 받아옵니다.

이후 cc.Render(blobcontour)를 이용하여 blobcontour에 윤곽선(컨투어)를 그립니다.

CvContourPolygon을 이용하여 폴리곤형태로 변환합니다.

다시 한 번 foreach문을 이용해 blobcontour에 폴리곤을 그립니다.



출력 결과

댓글 남기기