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 < 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 < 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을 통해 구한 중심좌표에 원그리기
결과