C#/C# OpenCV/

C# OpenCV 7-8. Blob(1) 라벨링

2019. 12. 17.

대표함수

Cv2.CvtColor 색공간 변환 [프로그래밍/C# OpenCV] - C# OpenCV 5-1. 색공간 변환

Cv2.Threshold 이미지 이진화 [프로그래밍/C# OpenCV] - C# OpenCV 4-2. Binary

blobs.Label 라벨링 진행

blobs.RenderBlobs 라벨링 결과 출력

 

Example Code


using System;
using System.Windows.Forms;
using OpenCvSharp;
using OpenCvSharp.Blob;

namespace blobTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Mat src = new Mat("image.png");
            Mat bin = new Mat();
            Cv2.CvtColor(src, bin, ColorConversionCodes.BGR2GRAY);
            Cv2.Threshold(bin, bin, 0, 255, ThresholdTypes.Otsu);
            Cv2.ImShow("src", src);

            Mat result = new Mat(src.Size(), MatType.CV_8UC3);
            CvBlobs blobs = new CvBlobs();
            blobs.Label(bin);
            blobs.RenderBlobs(src, result);
            
            foreach(var item in blobs)
            {
                CvBlob b = item.Value;

                Cv2.Circle(result, b.Contour.StartingPoint, 4, Scalar.Red, 2, LineTypes.AntiAlias);
                Cv2.PutText(result, b.Label.ToString(), new Point(b.Centroid.X, b.Centroid.Y), 
                    HersheyFonts.HersheyComplex, 1, Scalar.Yellow, 2, LineTypes.AntiAlias);
            }

            Cv2.ImShow("result", result);

            Cv2.WaitKey(0);
            Cv2.DestroyAllWindows();
        }
    }
}

 

Explain Code


	    using OpenCvSharp.Blob;

blob 라벨링을 사용하기 위해서는 using문 추가

 


	    Mat src = new Mat("image.png");
            Mat bin = new Mat();
            Cv2.CvtColor(src, bin, ColorConversionCodes.BGR2GRAY);
            Cv2.Threshold(bin, bin, 0, 255, ThresholdTypes.Otsu);
            Cv2.ImShow("src", src);
            

필요한 요소 선언

이미지 이진화

 


	    Mat result = new Mat(src.Size(), MatType.CV_8UC3);
            CvBlobs blobs = new CvBlobs();
            

blob 라벨링에 필요한 요소 선언

 

	    blobs.Label(bin);
            blobs.RenderBlobs(src, result);
            

blobs.Label(img)

      img binary 이미지, 원본 이미지 이진화하여 사용

 

blobs.RenderBlobs(src, dst)

      src 원본 이미지

      dst 결과 이미지

 


	    foreach(var item in blobs)
            {
                CvBlob b = item.Value;

                Cv2.Circle(result, b.Contour.StartingPoint, 4, Scalar.Red, 2, LineTypes.AntiAlias);
                Cv2.PutText(result, b.Label.ToString(), new Point(b.Centroid.X, b.Centroid.Y), 
                    HersheyFonts.HersheyComplex, 1, Scalar.Yellow, 2, LineTypes.AntiAlias);
            }
            

반복문을 통해 추가로 원하는 값 출력

편의상 var로 선언했으나 System.Collections.Generic.KeyValuePair<int, CvBlob> 구조이다

 

※ item값

  Label : 라벨링 번호

  Centroid : 중심점

  Area : 면적(moment00)

  Angle() : 등고선 각도

  Rect : 사각형 정보

  Contour.StartingPoint : 라벨링 시작 위치

 

결과