윤곽선(Contour)이란 특정 도형의 경계를 따라 있는 모든 점들을 연결한 선을 의미합니다. 윤곽선을 활용하면 다음과 같은 작업을 수행할 수 있습니다.
- 객체의 형태(shape) 파악
- 객체의 면적(area) 계산
- 객체 검출(detection)
- 객체 인식(recognition)
윤곽선 찾기: findContours() 메서드
OpenCV에서는 findContours() 메서드를 사용하여 이미지 내의 다양한 도형이나 객체의 윤곽선을 찾을 수 있습니다. 이 메서드는 이진화(binary)된 이미지를 입력으로 받아 윤곽선 목록을 반환합니다.
윤곽선 면적 계산: contourArea() 메서드
입력 이미지에 포함된 도형의 면적도 구할 수 있습니다. 이를 위해서는 Imgproc 클래스의 contourArea() 메서드를 호출하면 됩니다. 이 메서드는 특정 도형의 윤곽선을 매개변수로 받아 해당 도형의 면적을 계산하여 반환합니다.
예제 코드
다음 Java 예제는 주어진 이미지에서 각 도형(객체)의 면적을 구하고, 면적이 5000보다 큰 도형은 빨간색으로, 나머지는 흰색으로 윤곽선을 그려 출력합니다.
import java.util.ArrayList;
import java.util.List;
import org.opencv.core.Core;
import org.opencv.core.CvType;
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 FindContourArea {
public static void main(String args[]) throws Exception {
// OpenCV 핵심 라이브러리 로드
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
// 이미지 파일 읽기
String file = "D:\\Images\\javafx_graphical.jpg";
Mat src = Imgcodecs.imread(file);
// 원본 이미지를 그레이스케일로 변환
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);
// 결과를 그릴 빈 캔버스 생성
Mat draw = Mat.zeros(src.size(), CvType.CV_8UC3);
for (int i = 0; i < contours.size(); i++) {
Scalar color = new Scalar(0, 0, 255); // 기본 색상: 빨간색
// 윤곽선 면적 계산
double cont_area = Imgproc.contourArea(contours.get(i));
System.out.println(cont_area);
if (cont_area > 5000.0) {
// 면적이 5000보다 크면 빨간색으로 그리기
Imgproc.drawContours(draw, contours, i, color, 2,
Imgproc.LINE_8, hierarchey, 2, new Point());
} else {
// 그 외에는 흰색으로 그리기
color = new Scalar(255, 255, 255);
Imgproc.drawContours(draw, contours, i, color, 2,
Imgproc.LINE_8, hierarchey, 2, new Point());
}
}
// 결과 이미지 출력
HighGui.imshow("Contours operation", draw);
HighGui.waitKey();
}
}코드 설명
위 코드의 처리 흐름은 다음과 같습니다.
- 라이브러리 로드:
System.loadLibrary()를 통해 OpenCV 네이티브 라이브러리를 로드합니다. - 이미지 읽기:
Imgcodecs.imread()로 이미지 파일을 불러옵니다. - 전처리:
cvtColor()로 그레이스케일 변환 후,threshold()로 이진화하여 윤곽선 검출에 적합한 형태로 만듭니다. - 윤곽선 검출:
findContours()로 이진 이미지에서 모든 윤곽선을 추출합니다. - 면적 기반 분류 및 시각화: 각 윤곽선마다
contourArea()로 면적을 계산하고, 조건에 따라 다른 색상으로drawContours()를 호출해 윤곽선을 그립니다.
실행 결과
프로그램을 실행하면 콘솔에 각 도형의 면적이 다음과 같이 출력됩니다.
4091.0 6336.0 189.0 6439.0 4903.0
또한, 위 출력 결과와 함께 아래와 같이 윤곽선이 그려진 결과 창이 표시됩니다.

마무리
이처럼 OpenCV의 findContours()와 contourArea() 메서드를 조합하면 이미지 속 객체의 윤곽선을 검출하고 면적을 손쉽게 계산할 수 있습니다. 이 기법은 객체 검출, 형태 분석, 필터링 등 다양한 컴퓨터 비전 작업의 기초가 되므로 꼭 익혀두시길 권장합니다.