IT정보공유/C#

C# OpenCvSharp을 이용한 사각형 검출 방법

알지오™ 2018. 3. 13.

OpenCV 좀 맛뵈기로 사용해 보고 있는데,  생각보다 많이 어렵네요.

C#에서 사용이 가능은 OpenCvSharp을 이용한 사각형 검출에 관한 건데, 저도 접한지 몇 일 안되다 보니

도움이 전혀 안될 수도 있겠으나, 어쨌건 제가 공부한거고 까먹지 않고, 아는선에서

적당히 정보를 공유하고자 합니다.

 

OpenCv C# 사각형검출

 

AP_CI.png라는 이미지 파일을 준비했습니다. 사각형 검출을 할 꺼니까요.

위 이미지에서 사각형에는 빨간색을 칠할겁니다.

소스를 한번에 보는게 좋을 것 같네요.

 

C# OpenCV 사각형 검출 샘플 소스

//
            Mat ms = new Mat(@"AP_CI.png", ImreadModes.GrayScale); //원본 사진을 흑백으로 읽어옴
            ms = ms.Canny(75, 200, 3, true); // 외곽선 추출 함수
 
            Window window = new Window("viewer", WindowMode.FreeRatio);
            window.Resize(ms.Width, ms.Height);
            window.ShowImage(ms); // 외곽선 추출된 원본 이미지 팝업창
 
            OpenCvSharp.Point testpoint = new OpenCvSharp.Point();
            OpenCvSharp.Point[][] contours0;
            HierarchyIndex[] hierarchy;
 
            InputArray ia;
 
 
            Cv2.FindContours(ms, out contours0, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple, testpoint);
            //RetrievalModes.External 중요옵션, 외곽선만 따거나, 내외각선을 따거나 하는 옵션
            //외곽선 검출한 좌표를 contours0에 담아줍니다.
 
            OpenCvSharp.Size cvsize;
 
            cvsize.Width = ms.Width;
            cvsize.Height = ms.Height;
 
 
            Mat ms2 = new Mat(@"AP_CI2.png", ImreadModes.Color); //파일명만 변경된 원본이미지를 불러오고
 
             
 
            for (int i = 0; i < contours0.Length; i++)
            {
                double peri = Cv2.ArcLength(contours0[i], true);
 
                OpenCvSharp.Point [] pp = Cv2.ApproxPolyDP(contours0[i], 0.02*peri, true);
 
                RotatedRect rrect = Cv2.MinAreaRect(pp);
                double areaRatio = Math.Abs(Cv2.ContourArea(contours0[i], false)) / (rrect.Size.Width * rrect.Size.Height);
 
                if (pp.Length == 4)
                {
                    //for (int j = 0; j < pp.Length; j++)
                    //{
                    //    Cv2.Line(ms2, pp[j], pp[(j + 1) % pp.Length], Scalar.Green, 1, LineTypes.AntiAlias, 0);
                    //}
                    Cv2.DrawContours(ms2, contours0, i, Scalar.Red, 1, LineTypes.AntiAlias, hierarchy, 100, testpoint);
                    //Cv2.Line(ms2, contours0[i], , Scalar.Green, 1, LineTypes.AntiAlias, 0);
                }
                else
                {
 
                    Cv2.DrawContours(ms2, contours0, i, Scalar.Yellow, 1, LineTypes.AntiAlias, hierarchy, 100, testpoint);
                }
                     
            }
 
 
            Window window2 = new Window("viewer2", WindowMode.FreeRatio);
            window2.Resize(ms2.Width, ms2.Height);
            window2.ShowImage(ms2);
//
//

 

간략히 소스에 대해서 설명을 하자면, 버튼 클릭시 동작하는 소스이고, 

 

원본파일과, 사각형을 검출하여 사각형 위에 녹색을 칠하는 소스입니다.

실제로 소스를 컴파일 해서 동작시켜 보면 아래와 같이 창이 2개 열리고, 

왼쪽 이미지는 원본 이미지에서 외곽선 검출을 한 상태이고, 오른쪽 창은 사각형에는 빨간박스로 표시를 했습니다.

그외 사각형이 아니면 노란색을 칠해봤고요.

 

 

검출한 이미지

 

소스를 대충 설명하면 외곽선을 추출한 뒤에 외곽선 정보를 가지고 도형정보를 가져옵니다.

Cv2.ApproxPolyDP를 이용해 도형의 변 좌표들을 가져와서 

변이 4개이면 사각형, 5개이면 오각형 등으로 구분을 하는 방식입니다.

 

소스를 보고 직접 해보는게 이해가 훨씬 빠르실거고, 저같은 돌대가리 아니면 금방이해하실듯하네요.

댓글

💲 추천 글