윤곽선이란 무엇인가요?
윤곽선(Contour)은 이미지에서 같은 색이나 밝기를 가진 경계선을 따라 연결된 곡선 형태예요.
쉽게 말해, 물체의 테두리를 찾아서 좌표로 표현한 것이죠.
OpenCV에서는 findContours() 함수를 사용해서
이진 이미지로부터 윤곽선을 추출하고,
drawContours()로 이를 시각화할 수 있어요.
보통 Canny 엣지나 Threshold를 적용한 후에 윤곽선을 검출합니다.
윤곽선 검출 기본 예제
cv::Mat img = cv::imread("sample.jpg"); cv::Mat gray, binary; cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY); cv::threshold(gray, binary, 128, 255, cv::THRESH_BINARY); std::vector<std::vector<cv::Point>> contours; cv::findContours(binary, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); |
위 코드는 외곽 윤곽선만 추출하며, 각 윤곽선은 std::vector<Point> 형태로 저장돼요.
윤곽선 그리기 예제
cv::Mat contourImg = img.clone(); cv::drawContours(contourImg, contours, -1, cv::Scalar(0, 255, 0), 2); cv::imshow("Contours", contourImg); cv::waitKey(0); |
drawContours()에서 -1은 모든 윤곽선을 의미하고, 초록색(0,255,0) 선으로 두께 2로 그려줍니다.
윤곽선 정보 활용하기
검출된 윤곽선을 통해 면적, 중심 좌표, 둘레 등을 계산할 수 있어요.
예를 들어 cv::contourArea(), cv::arcLength(), cv::moments() 등을 활용해
객체의 크기와 위치를 파악할 수 있죠.
아래는 간단한 중심 좌표 추출 예제예요:
cv::Moments m = cv::moments(contours[0]); cv::Point center(m.m10 / m.m00, m.m01 / m.m00); cv::circle(img, center, 5, cv::Scalar(0, 0, 255), -1); |
윤곽선 검출 시 주의할 점
윤곽선을 검출하려면 반드시 이진 이미지가 필요해요.
그래서 grayscale → threshold 또는 Canny를 선행해야 하고,
배경이 복잡하거나 객체의 명암이 약한 경우엔 정확한 윤곽선이 나오지 않을 수 있어요.
또한 너무 많은 윤곽선을 찾는 경우에는 RETR_EXTERNAL로 바깥쪽만 추출하거나,
면적 기준 필터링을 통해 불필요한 경계는 걸러주는 게 좋아요.
최종 목적이 객체 검출이라면,
윤곽선과 연결된 bounding box, minEnclosingCircle, convexHull 같은 도형 분석 함수들도 함께 알아두면 좋아요.
이 블로그의 내용을 대화 형식인 음성으로 들으면서 정리하면, 보다 쉽게 이해할 수 있을 거예요.
다운받아 들어보세요~
'IT' 카테고리의 다른 글
OpenCV로 엣지 검출: Canny 알고리즘 설명과 활용 (0) | 2025.06.26 |
---|---|
OpenCV로 밝기 및 대비 조절하기 (0) | 2025.06.26 |
OpenCV에서 이미지 히스토그램 분석 (1) | 2025.06.26 |
OpenCV 필터링: 블러, 가우시안, 미디언 필터 사용법 (0) | 2025.06.25 |
OpenCV로 이미지 자르기와 리사이징 (0) | 2025.06.25 |