1. 개요
이미지에서 객체의 외곽선을 감지하고, 윤곽선을 따라 꼭지점을 찾는 것은 이미지 처리에서 매우 중요한 작업 중 하나입니다. C#에서 OpenCvSharp 라이브러리를 활용하면 이러한 작업을 쉽게 수행할 수 있습니다. 이번 글에서는 OpenCvSharp을 이용하여 외곽선을 검출하고, 윤곽선을 따라 꼭지점을 찾아 시각적으로 표현하는 방법을 설명하겠습니다.
2. OpenCvSharp 설정
OpenCvSharp을 사용하려면 NuGet 패키지를 설치해야 합니다. Visual Studio에서 OpenCvSharp4 및 OpenCvSharp4.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을 활용하여 이미지에서 외곽선을 검출하고, 꼭지점을 찾는 방법을 익혔습니다. 다양한 이미지에서 실험해 보면서 더 나은 결과를 얻도록 최적화할 수 있습니다.