C# OpenCV 강좌 : 제 26강 - 원 검출

   

원 검출 (Hough Transform Circles)


1 영상이나 이미지의 원을 찾기 위해 사용합니다. 영상이나 이미지에서 HoughCircles를 이용해 을 찾을 수 있습니다.


원본(Source, src)를 영상이나 이미지를 사용하면 됩니다.

영상 사용하기 : 3강 바로가기
이미지 사용하기 : 4강 바로가기


Class


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;

namespace test
{
    class OpenCV : IDisposable
    {  
        IplImage houcircle;
        
        public IplImage HoughCircles(IplImage src)
        {
            houcircle = new IplImage(src.Size, BitDepth.U8, 3);
            IplImage gray = new IplImage(src.Size, BitDepth.U8, 1);

            Cv.Copy(src, houcircle);
            Cv.CvtColor(src, gray, ColorConversion.BgrToGray);
            Cv.Smooth(gray, gray, SmoothType.Gaussian, 9);

            CvMemStorage Storage = new CvMemStorage();
            CvSeq<CvCircleSegment> circles = Cv.HoughCircles(gray, Storage, HoughCirclesMethod.Gradient, 1, 100, 150, 50, 0, 0);

            foreach (CvCircleSegment item in circles)
            {
                Cv.Circle(houcircle, item.Center, (int)item.Radius, CvColor.Blue, 3);
            }
            return houcircle;
        }
                  
        public void Dispose()
        {
            if (houcircle != null) Cv.ReleaseImage(houcircle);
        }
    }
}

Class Code


houcircle = new IplImage(src.Size, BitDepth.U8, 3);
IplImage gray = new IplImage(src.Size, BitDepth.U8, 1);

Cv.Copy(src, houcircle);
Cv.CvtColor(src, gray, ColorConversion.BgrToGray);
Cv.Smooth(gray, gray, SmoothType.Gaussian, 9);

houcircle은 원본을 복사한 이미지입니다. gray이미지는 GrayScaleBlur를 적용한 이미지입니다. Hough Transform CirclesGrayScale의 이미지를 사용하며, 정확도를 높이기 위하여 Gaussian Blur를 적용합니다.


Blur Parameter 알아보기 : 13강 바로가기


CvMemStorage Storage = new CvMemStorage();
CvSeq<CvCircleSegment> circles = Cv.HoughCircles(gray, Storage, HoughCirclesMethod.Gradient, 1, 100, 150, 50, 0, 0);

원(Circles)을 검출하기 위하여 Storage, circles를 선언하고 Cv.HoughCircles()를 적용합니다. Cv.HoughCircles(그레이스케일, 메모리 저장소, 계산 방법, 분해능, 최소거리, Edge 임계값, 중심 임계값, 최소반지름, 최대반지름)입니다.

계산 방법HoughCirclesMethod.Gradient만 지원합니다.

분해능은 화면 최대크기에 대한 축소율입니다. 1을 사용할 경우 이미지와 동일한 크기를 사용합니다. 2를 사용할 경우 이미지의 절반 크기로 사용합니다.  

최소거리는 원과 원 사이의 최소한의 거리입니다.

Edge 임계값은 Canny Edge의 상위 임계값입니다. 하위 임계값은 상위 임계값의 절반으로 자동으로 설정됩니다.

중심 임계값은 CV_HOUGH_GRADIENT에 적용된 중심 Histogram에 대한 임계값입니다.

최소반지름, 최대반지름은 검출될 원의 반지름의 범위입니다. 0을 입력 시, 검출 할 수 있는 최소, 최대 반경으로 모든 원을 검색합니다.

  • Tip : Edge 임계값이 낮을 수록 같은 위치의 더 많은 원을 검출합니다.
  • Tip : 중심 임계값이 낮을 수록 다른 위치의 더 많은 원을 검출합니다.


foreach (CvCircleSegment circle in circles)
{
    Cv.Circle(houcircle, circle.Center, (int)circle.Radius, CvColor.Blue, 3);
}

foreach문을 이용하여 검출된 원circle으로 사용합니다. Cv.Circle()을 이용하여 원을 그립니다.

circle에는 중심점(Center)반지름(Radius) 값이 저장됩니다. circle.Center.Xcircle.Center.Y를 이용하여 중심점의 (x, y)를 따로 얻을 수 있습니다.


Result


2



도움이 되셨다면 광고 클릭 부탁드립니다.

⤧  Next post C# OpenCV 강좌 : 제 27강 - 모폴로지 - 팽창 & 침식 ⤧  Previous post C# OpenCV 강좌 : 제 25강 - 직선 검출