C#/C# OpenCV/

C# OpenCV 7-4. Contour(4) 경계사각형

2019. 12. 11.

대표함수

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.Rectangle 사각형 그리기 [프로그래밍/C# OpenCV] - C# OpenCV 3-5. Drawing

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

Cv2.BoundingRect 경계사각형 찾기

Cv2.MinAreaRect 외접하는 최소 크기 외접 사각형 찾기

 

Example Code


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

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

        private void Form1_Load(object sender, EventArgs e)
        {
            Mat src = new Mat("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.Green, 2, LineTypes.AntiAlias, hierarchy);
            }

            for (int i = 0; i &lt contour.Length; i++)
            {
                Rect rect = Cv2.BoundingRect(contour[i]);
                Cv2.Rectangle(result, new Point(rect.X, rect.Y), new Point(rect.X+rect.Width,rect.Y+rect.Height), 
                    Scalar.Yellow, 2, LineTypes.AntiAlias);
            }

            for (int i = 0; i &lt contour.Length; i++)
            {
                RotatedRect rect = Cv2.MinAreaRect(contour[i]);
                for(int j = 0; j &lt 4; j++)
                {
                    Cv2.Line(result, new Point(rect.Points()[j].X, rect.Points()[j].Y), 
                        new Point(rect.Points()[(j + 1) % 4].X, rect.Points()[(j + 1) % 4].Y), 
                        Scalar.Red, 2, LineTypes.AntiAlias);
                }
            }
            Cv2.ImShow("result", result);

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

 

Explain Code


	    Mat src = new Mat("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.Green, 2, LineTypes.AntiAlias, hierarchy);
            }
            

contour 찾기

contour 그리기 - 녹색

 


	    for (int i = 0; i &lt contour.Length; i++)
            {
                Rect rect = Cv2.BoundingRect(contour[i]);
                Cv2.Rectangle(result, new Point(rect.X, rect.Y), new Point(rect.X+rect.Width,rect.Y+rect.Height), 
                    Scalar.Yellow, 2, LineTypes.AntiAlias);
            }
            

contour[i]경계 사각형 정보 찾아서 rect변수 할당

 

Cv2.BoundingRect(IEnumerable<Point> curve)

      curve contour 혹은 곡선 정보를 담고있는 Point

 

Cv2.Rectangle 이용 경계 사각형 그리기 - 노랑

※ 시작점 Point(rect.X, rect.Y), 끝점 Point(rect.X + rect.Width, rect.Y + rect.Height)

 

	    for (int i = 0; i &lt contour.Length; i++)
            {
                RotatedRect rect = Cv2.MinAreaRect(contour[i]);
                for(int j = 0; j &lt 4; j++)
                {
                    Cv2.Line(result, new Point(rect.Points()[j].X, rect.Points()[j].Y), 
                        new Point(rect.Points()[(j + 1) % 4].X, rect.Points()[(j + 1) % 4].Y), 
                        Scalar.Red, 2, LineTypes.AntiAlias);
                }
            }
            

contour[i]최소 크기 외접 사각형 정보 찾아서 rect변수 할당

 

Cv2.MinAreaRect(IEnumerable<Point> points)

      points contour 혹은 points정보

 

for문과 Cv2.Line을 이용 사각형 그리기 - 빨강

Cv2.MinAreaRect에서 반환된 RotatedRect의 값은  X, Y, Width, Height 정보가아닌 Center, Angle, Size 정보로 구성되어있다.

   따라서 Point정보를 사용하고싶으면 RotatedRect.Points() 를 호출하여 사용할 수 있는데, 이 값도 Point2f값이기에 변환해서 사용해줘야한다.

 

결과