C#/C# OpenCV/

C# OpenCV 7-5. Contour(5) 외접원

2019. 12. 12.

대표함수

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

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

Cv2.FindContour contour 찾기 [프로그래밍/C# OpenCV] - C# OpenCV 7-1. Contour(1) 윤곽선 찾기

Cv2.DrawContour contour 그리기 [프로그래밍/C# OpenCV] - C# OpenCV 7-1. Contour(1) 윤곽선 찾기

Cv2.Circle 원 그리기 [프로그래밍/C# OpenCV] - C# OpenCV 3-5. Drawing

Cv2.MinEnclosingCircle 외접원 찾기

 

Example Code


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

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

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

            Cv2.FindContours(bin, out Point[][] contour, out HierarchyIndex[] hierarchy, 
                RetrievalModes.Tree, ContourApproximationModes.ApproxSimple);
            for(int i = 0; i &lt contour.Length; i++)
            {
                Cv2.DrawContours(result, contour, i, Scalar.Yellow, 2, LineTypes.AntiAlias, hierarchy);
            }

            for(int i = 0; i &lt contour.Length; i++)
            {
                Cv2.MinEnclosingCircle(contour[i], out Point2f center, out float radius);
                Cv2.Circle(result, new Point(center.X, center.Y), (int)radius, Scalar.Red, 2, LineTypes.AntiAlias);
            }
            Cv2.ImShow("result", result);

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

 

Explain Code


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

필요한 요소 선언, 초기화

이미지 이진화

 


	    Cv2.FindContours(bin, out Point[][] contour, out HierarchyIndex[] hierarchy, 
                RetrievalModes.Tree, ContourApproximationModes.ApproxSimple);
            for(int i = 0; i &lt contour.Length; i++)
            {
                Cv2.DrawContours(result, contour, i, Scalar.Yellow, 2, LineTypes.AntiAlias, hierarchy);
            }
            

contour 찾기

contour 그리기 - 노랑

 

	    for(int i = 0; i &lt contour.Length; i++)
            {
                Cv2.MinEnclosingCircle(contour[i], out Point2f center, out float radius);
                Cv2.Circle(result, new Point(center.X, center.Y), (int)radius, Scalar.Red, 2, LineTypes.AntiAlias);
            }
            

contour[i]외접원 중심, 반경 정보 찾아서 반환

 

Cv2.MinClosingCircle(IEnumerable<Point> points, out Point2f center, out float radius)

      points 외접원 정보를 구할 point배열

      center 반환되는 중심값을 저장할 변수

      radius 반환되는 반경값을 저장할 변수

 

Cv2.Circle 이용 원그리기 - 빨강

※ 반환된 center, radius의 형태와 Cv2.Circle에서 필요로 하는 매개변수의 형태가 다르다.

  변환해서 사용

 

결과