본문 바로가기
카테고리 없음

C# OpenCvSharp을 활용한 외곽선(윤곽선) 및 꼭지점 검출 방법

by tasiklee 2025. 2. 26.

1. 개요

이미지에서 객체의 외곽선을 감지하고, 윤곽선을 따라 꼭지점을 찾는 것은 이미지 처리에서 매우 중요한 작업 중 하나입니다. C#에서 OpenCvSharp 라이브러리를 활용하면 이러한 작업을 쉽게 수행할 수 있습니다. 이번 글에서는 OpenCvSharp을 이용하여 외곽선을 검출하고, 윤곽선을 따라 꼭지점을 찾아 시각적으로 표현하는 방법을 설명하겠습니다.

2. OpenCvSharp 설정

OpenCvSharp을 사용하려면 NuGet 패키지를 설치해야 합니다. Visual Studio에서 OpenCvSharp4OpenCvSharp4.Runtime.Windows 패키지를 설치하세요.

Install-Package OpenCvSharp4
Install-Package OpenCvSharp4.Runtime.Windows

3. 외곽선 검출 및 그리기

3.1 이미지 로드 및 전처리

먼저, 이미지를 흑백으로 변환하고 가우시안 블러를 적용한 후, Canny 엣지 검출을 수행합니다.

using OpenCvSharp;

class Program
{
    static void Main()
    {
        string imagePath = "sample.jpg";
        Mat src = Cv2.ImRead(imagePath, ImreadModes.Color);
        Mat gray = new Mat();
        Mat blurred = new Mat();
        Mat edges = new Mat();

        Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);
        Cv2.GaussianBlur(gray, blurred, new Size(5, 5), 1.5);
        Cv2.Canny(blurred, edges, 50, 150);

        Cv2.ImShow("Edges", edges);
        Cv2.WaitKey(0);
    }
}

3.2 윤곽선 검출 및 그리기

Canny 검출된 이미지에서 Cv2.FindContours를 사용하여 외곽선을 찾고, Cv2.DrawContours를 활용하여 화면에 출력할 수 있습니다.

List<MatOfPoint> contours = new List<MatOfPoint>();
HierarchyIndex[] hierarchy;

Cv2.FindContours(edges, out contours, out hierarchy, RetrievalModes.List, ContourApproximationModes.ApproxSimple);
Mat contourImage = new Mat(src.Size(), MatType.CV_8UC3, Scalar.Black);

Cv2.DrawContours(contourImage, contours, -1, Scalar.White, 2);
Cv2.ImShow("Contours", contourImage);
Cv2.WaitKey(0);

위 코드에서는 FindContours 함수를 사용하여 외곽선을 감지하고, DrawContours를 활용하여 화면에 출력합니다.

4. 꼭지점 검출

꼭지점을 찾기 위해 Cv2.ApproxPolyDP 함수를 사용하여 윤곽선을 단순화할 수 있습니다.

foreach (var contour in contours)
{
    double epsilon = 0.02 * Cv2.ArcLength(contour, true);
    Point[] approx = Cv2.ApproxPolyDP(contour, epsilon, true);

    foreach (var point in approx)
    {
        Cv2.Circle(src, point, 5, Scalar.Red, -1);
    }
}

Cv2.ImShow("Corners", src);
Cv2.WaitKey(0);

위 코드에서는 ApproxPolyDP를 사용하여 윤곽선을 단순화하고, 꼭지점을 찾아 원으로 표시합니다.

5. 결론

이제 OpenCvSharp을 활용하여 이미지에서 외곽선을 검출하고, 꼭지점을 찾는 방법을 익혔습니다. 다양한 이미지에서 실험해 보면서 더 나은 결과를 얻도록 최적화할 수 있습니다.