윤곽선(Contour)이란 특정 도형의 경계를 따라 있는 모든 점들을 연결한 선을 의미합니다. 윤곽선을 활용하면 다음과 같은 작업을 수행할 수 있습니다.
객체의 형태(shape) 파악
객체의 면적(area) 계산
객체 감지(Detection)
객체 인식(Recognition)
윤곽선 찾기와 그리기
OpenCV에서는 findContours() 메서드를 사용해 이미지 속 다양한 도형과 객체의 윤곽선을 검출할 수 있습니다. 이렇게 찾아낸 윤곽선은 drawContours() 메서드로 화면에 그릴 수 있으며, 이 메서드는 아래와 같은 매개변수를 받습니다.
결과 이미지를 저장할 빈 Mat 객체
검출된 윤곽선들이 담겨 있는 List 객체
그릴 윤곽선을 지정하는 정수 값 (음수(-1)를 넣으면 모든 윤곽선을 그림)
윤곽선의 색상을 지정하는 Scalar 객체
윤곽선의 두께를 지정하는 정수 값
예제 코드
import java.util.ArrayList;
import java.util.List;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class DrawingContours {
public static void main(String args[]) throws Exception {
// OpenCV 핵심 라이브러리 로딩
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
String file = "D:\\Images\\shapes.jpg";
Mat src = Imgcodecs.imread(file);
// 원본 이미지를 이진화(binary) 이미지로 변환
Mat gray = new Mat(src.rows(), src.cols(), src.type());
Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
Mat binary = new Mat(src.rows(), src.cols(), src.type(), new Scalar(0));
Imgproc.threshold(gray, binary, 100, 255, Imgproc.THRESH_BINARY_INV);
// 윤곽선 검출
List<MatOfPoint> contours = new ArrayList<>();
Mat hierarchey = new Mat();
Imgproc.findContours(binary, contours, hierarchey, Imgproc.RETR_TREE,
Imgproc.CHAIN_APPROX_SIMPLE);
// 윤곽선 그리기
Scalar color = new Scalar(0, 0, 255);
Imgproc.drawContours(src, contours, -1, color, 2, Imgproc.LINE_8,
hierarchey, 2, new Point());
HighGui.imshow("Drawing Contours", src);
HighGui.waitKey();
}
}입력 이미지

실행 결과
위 프로그램을 실행하면 다음과 같은 창이 생성됩니다.

코드 설명
위 예제의 처리 흐름을 단계별로 살펴보면 다음과 같습니다.
이미지 로드:
Imgcodecs.imread()로 이미지 파일을 읽어옵니다.그레이스케일 변환:
cvtColor()와COLOR_BGR2GRAY옵션으로 컬러 이미지를 회색조 이미지로 변환합니다.이진화:
threshold()메서드로 임계값 기준 픽셀을 흑백으로 구분합니다. 여기서는 배경과 객체를 명확히 분리하기 위해THRESH_BINARY_INV(반전 이진화)를 사용했습니다.윤곽선 검출:
findContours()에RETR_TREE(모든 윤곽선 계층 구조 검색)와CHAIN_APPROX_SIMPLE(불필요한 좌표 제거) 옵션을 적용합니다.윤곽선 그리기: 빨간색(0, 0, 255)으로 두께 2픽셀의 윤곽선을 원본 이미지 위에 그립니다.
윤곽선 검출 시 이진화 과정은 필수에 가깝습니다. 노이즈가 많은 이미지라면 GaussianBlur() 등으로 블러링을 먼저 적용하면 더 정확한 결과를 얻을 수 있습니다.