Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java OpenCV로 이미지 윤곽선(Contour) 검출 및 그리기 완벽 가이드

윤곽선(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();
    }
}

입력 이미지

Java OpenCV로 이미지 윤곽선(Contour) 검출 및 그리기 완벽 가이드

실행 결과

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

Java OpenCV로 이미지 윤곽선(Contour) 검출 및 그리기 완벽 가이드

코드 설명

위 예제의 처리 흐름을 단계별로 살펴보면 다음과 같습니다.

  1. 이미지 로드: Imgcodecs.imread()로 이미지 파일을 읽어옵니다.

  2. 그레이스케일 변환: cvtColor()COLOR_BGR2GRAY 옵션으로 컬러 이미지를 회색조 이미지로 변환합니다.

  3. 이진화: threshold() 메서드로 임계값 기준 픽셀을 흑백으로 구분합니다. 여기서는 배경과 객체를 명확히 분리하기 위해 THRESH_BINARY_INV(반전 이진화)를 사용했습니다.

  4. 윤곽선 검출: findContours()RETR_TREE(모든 윤곽선 계층 구조 검색)와 CHAIN_APPROX_SIMPLE(불필요한 좌표 제거) 옵션을 적용합니다.

  5. 윤곽선 그리기: 빨간색(0, 0, 255)으로 두께 2픽셀의 윤곽선을 원본 이미지 위에 그립니다.

윤곽선 검출 시 이진화 과정은 필수에 가깝습니다. 노이즈가 많은 이미지라면 GaussianBlur() 등으로 블러링을 먼저 적용하면 더 정확한 결과를 얻을 수 있습니다.