C#/C# OpenCV/

C# OpenCV 7-2. Contour(2) 질량중심

2019. 12. 9.

대표함수

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

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

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

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

Cv2.Moments moment 검출

※ Moment

moment의 인자는 1xN 또는 Nx1의 형태

 

공간 모멘트

m00, m01, m10, m11, m20, m02, m30, m21, m12, m03

 

중심 모멘트

mu20, mu11, mu02, mu30, mu21, mu12, mu03

 

평준화 중심 모멘트

nu20, nu11, nu02, nu30, nu21, nu12, nu03

 

Example Code


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

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

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

            Mat hierarchy = new Mat();
            Cv2.FindContours(bin, out Mat[] contour, hierarchy, RetrievalModes.List, ContourApproximationModes.ApproxSimple);

            for (int i = 0; i &lt contour.Length; i++)
            {
                Moments mmt = Cv2.Moments(contour[i]);
                double cx = mmt.M10 / mmt.M00,
                    cy = mmt.M01 / mmt.M00;

                Cv2.Circle(dst, new Point(cx, cy), 3, Scalar.Red, -1, LineTypes.AntiAlias);
            }
            Cv2.ImShow("dst", dst);

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

 

Explain Code


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

            Mat hierarchy = new Mat();
            

필요한 요소 정의

이미지 이진화

 


	    Cv2.FindContours(bin, out Mat[] contour, hierarchy, RetrievalModes.List, ContourApproximationModes.ApproxSimple);

contour찾기

 

	    for (int i = 0; i &lt contour.Length; i++)
            {
                Moments mmt = Cv2.Moments(contour[i]);
                double cx = mmt.M10 / mmt.M00,
                    cy = mmt.M01 / mmt.M00;

                Cv2.Circle(dst, new Point(cx, cy), 3, Scalar.Red, -1, LineTypes.AntiAlias);
            }

for문으로 contour의 길이만큼 반복수행

 

Cv2.Moment(InputArray array)

      array 모멘트를 찾을 contour

 

centerX, centerY 좌표 생성

※ 질량 중심 cx = m10 / m00, cy = m01 / m00

 

Cv2.Circle을 통해 구한 중심좌표에 원그리기

 

결과