C# OpenCV 강좌 : 제 33강 - Blob 윤곽선 검출

   

윤곽선 (Contour)


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


원본(Source, src)를 영상이나 이미지를 사용하면 됩니다.


영상 사용하기 : 3강 바로가기
이미지 사용하기 : 4강 바로가기


Class


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

namespace test
{
    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);
        }
    }
}


Class Code


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에 폴리곤을 그립니다.


Result


2



도움이 되셨다면 광고 클릭 부탁드립니다.

⤧  Next post C# OpenCV 강좌 : 제 34강 - 경계 사각형 ⤧  Previous post C# OpenCV 강좌 : 제 32강 - Blob 라벨링