Prerequisite : 윤곽선 길이 구하기

Convex hull

Convex hull이란 2차원 평면상에 여러개의 점이 있을 때, 점들 중 일부를 이용하여 Convex(볼록)한 다각형이면서, 다각형 내부에 모든 점을 포함시키는 것을 의미한다.

아래의 이미지를 참조하여 주어진 정점에 대한 Convex hull 알고리즘의 결과를 확인하자.

원본
Convex hull 알고리즘을 통해 주어진 정점을 감싸는 볼록한 다각형

현재 OpenCV에서는 convex hull을 구하기 위해 convexHull()이라는 함수를 제공하며, 이는 Jack Sklansky이 고안한 알고리즘을 사용하고 O(N logN)의 시간복잡도를 갖는다.

Imgproc.convexHull(contour, hull)

contour: 윤곽선 좌표 (정점들)
hull: 주어진 정점들을 볼록하게 감쌀 수 있는 정점 배열

convexHull함수를 이용하여 이미지내 윤곽선을 감싸는 예제를 살펴보자.

예제 코드:

val contours = ArrayList<MatOfPoint>()
val hierarchy = Mat()

//윤곽선 검출
Imgproc.findContours(
    binarySrc,
    contours,
    hierarchy,
    Imgproc.RETR_TREE,
    Imgproc.CHAIN_APPROX_SIMPLE
)
for (i in 0 until contours.size) {
    val contour = contours[i]
    val hull = MatOfInt()

    // 컨벡스 헐 찾기
    Imgproc.convexHull(contour, hull)

    // 컨벡스 헐 정점만 추려내기
    val contourArray: Array<Point> = contour.toArray()
    val hullPoints: Array<Point?> = arrayOfNulls(hull.rows())
    val hullContourIdxList = hull.toList()
    for (j in hullContourIdxList.indices) {
        hullPoints[j] = contourArray[hullContourIdxList[j]]
    }
    
    // 처음에 검출한 윤곽선 정보를 토대로 그리기
    Imgproc.drawContours(src, contours, i, RED)
    // 컨벡스 헐 정보를 토대로 그리기
    Imgproc.drawContours(src, listOf(MatOfPoint(*hullPoints)),0, GREEN)
}
카테고리: OpenCV

0개의 댓글

답글 남기기

Avatar placeholder

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