Prerequisite : 윤곽선 길이 구하기

윤곽선 근사화

윤곽선 근사화란 검출한 윤곽선 정보를 분석하여 정점(vertex) 수가 적은 윤곽선 또는 다각형으로 표현할 수 있게 만드는 방법을 의미 한다. 이때 Douglas-Peucker 알고리즘을 사용한다.

Douglas-Peucker 알고리즘으로 근사화 하는 과정을 보여주는 영상

OpenCV에서 윤곽선 근사화를 위해 approxPolyDP라는 함수를 제공하고 있다.

approxPolyDP(curve, approxCurve, epsilon, closed)

curve: 입력할 곡선 좌표(윤곽선 좌표)
approxCurve: 함수 호출 후 참조 가능한 근사화 된 곡선 좌표
epsilon: 근사화 정밀도 조절. 입력 곡선과 근사화 곡선 간의 최대 거리.
예) arcLenth(curve) *0.02
closed: 폐곡선 여부. true면 폐곡선

epsilon값을 조절하여 근사화 된 곡선을 얻는 예제를 살펴보자.

예제코드:

val contours = ArrayList<MatOfPoint>()
val hierarchy = Mat()
//윤곽선 찾기
Imgproc.findContours(binarySrc, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE)
for(contour in contours){
    // 윤곽선 정보를 MatOfPoint2f타입으로 변환
    val contour2f = MatOfPoint2f(*contour.toArray())
    // approxPolyDP 호출후 참조할 근사화 된 윤곽선 정보
    val approxCurve = MatOfPoint2f()
    // 윤곽선 근사화 정보 얻기
    Imgproc.approxPolyDP(
        contour2f, 
        approxCurve, 
        Imgproc.arcLength(contour2f, true)*(0.005*value1),
        true
    )
    val points = approxCurve.toList()
    // 근사화 된 윤곽선 정점들을 line 함수를 통해 이어 그리기
    for(i in points.indices){
        Imgproc.line(src, points[i], points[(i+1)%points.size], RED, 2)
    }
}
donaricano-btn

카테고리: OpenCV

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.