C# OpenCV labeling

2021. 1. 19. 09:00OpenCV/OpenCV C#

반응형

실행 코드

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

namespace KeyboardLabeling
{
    class Program
    {
        static void Main(string[] args)
        {
            Mat src = new Mat("../../keyboard.png");
            Mat bin = new Mat();
            Mat binary = new Mat();

            src = src.SubMat(new Rect(300, 300, 1000, 1000)); // 이미지 자르기

            Cv2.CvtColor(src, bin, ColorConversionCodes.BGR2GRAY); // gray
            Cv2.Threshold(bin, binary, 125, 255, ThresholdTypes.BinaryInv); //이진화

            Mat result = new Mat(src.Size(), MatType.CV_8UC3);
            CvBlobs blobs = new CvBlobs();
            blobs.Label(binary);
            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("src", src);
            Cv2.ImShow("binary", binary);
            Cv2.ImShow("result", result);
            Cv2.WaitKey(0);

        }
    }
}

 

결과화면

이미지 전처리

 

2

 

labeling

 

3

부족한 점

키보드의 사각형만 인식할 수 있게 이미지 전처리를 해야 하는데 부족했던 것 같다.

2021-01-18 키보드 라벨링 다시 도전

추가한 내용

  1. 면적에 따라 라벨링 설정
  2. 라벨링 번호 따로 설정

실행코드

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

namespace KeyboardLabeling
{
    class Program
    {
        static void Main(string[] args)
        {
            Mat src = new Mat("../../keyboard.png");
            Mat bin = new Mat();
            Mat binary = new Mat();

            src = src.SubMat(new Rect(300, 300, 1000, 1000)); // 이미지 자르기

            Cv2.CvtColor(src, bin, ColorConversionCodes.BGR2GRAY); // gray
            Cv2.Threshold(bin, binary, 125, 255, ThresholdTypes.BinaryInv); //이진화

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

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

            int text = 1; // 번호
            foreach (var item in blobs)
            {
                if (item.Value.Area > 40000) // 라벨링 면적 확인
                {  
                    CvBlob b = item.Value;

                    Cv2.Circle(result, b.Contour.StartingPoint, 8, Scalar.Red, 2, LineTypes.AntiAlias);
                    Cv2.PutText(result, text.ToString(), new Point(b.Centroid.X, b.Centroid.Y),  // 라벨링 번호 설정 수정
                        HersheyFonts.HersheyComplex, 1, Scalar.Yellow, 2, LineTypes.AntiAlias);
                    text++;
                }
            }

            Cv2.ImShow("src", src);
            Cv2.ImShow("binary", binary);
            Cv2.ImShow("result", result);
            Cv2.WaitKey(0);

        }
    }
}

 

결과 화면

원본

1

이미지 전처리

2

라벨링

3

반응형

'OpenCV > OpenCV C#' 카테고리의 다른 글

C# OpenCV QRcode scanner  (0) 2021.01.27
C# OpenCV Transformation  (0) 2021.01.17
C# OpenCV labeling Segmentation  (0) 2021.01.12
C# OpenCV histogram gray color BGR 그리기  (0) 2021.01.09
C# OpenCV 이미지 전처리  (0) 2021.01.06