Prerequisite : 윤곽선 길이 구하기

Convex 검사

Convex 검사는 주어진 윤곽선이 볼록한지 여부를 확인하는 것을 말한다.

Convex Hull

OpenCV에서는 isContourConvex()라는 함수를 통해 Convex 검사를 할 수 있다.

Imgproc.isContourConvex(contour)

contour: 윤곽선 좌표 정보.
반환값: convex 여부

convex를 검사하는 예제를 살펴보자.

볼록한 도형의 경우 Convex라고 마킹되어있고, 오목한 도형의 경우 Concave라고 마킹되어있다. 흰 바탕의 배경도 하나의 큰 convex한 윤곽선으로 인식되었다.

예제코드:

val contours = ArrayList<MatOfPoint>()
val hierarchy = Mat()
// 윤곽선 검출
Imgproc.findContours(
    binary,
    contours,
    hierarchy,
    Imgproc.RETR_TREE,
    Imgproc.CHAIN_APPROX_SIMPLE
)

for (i in 0 until contours.size) {
    //윤곽선 중점 찾기
    val contour = contours[i]
    val moments = Imgproc.moments(contour)
    val centerX = moments.m10 / moments.m00 - 60
    val centerY = moments.m01 / moments.m00 + 10
    val center = Point(centerX, centerY)

    // 검출한 윤곽선 그리기
    Imgproc.drawContours(src, contours, i, RED)

    // 컨벡스 검출 정확도를 높이기 위해 윤곽선 근사화
    val contour2f = MatOfPoint2f(*contours[i].toArray())
    val approxContour = MatOfPoint2f()
    Imgproc.approxPolyDP(
        contour2f,
        approxContour,
        Imgproc.arcLength(contour2f, true)*(0.02),
        true
    )

    // 컨벡스 검사하기
    val isConvex = Imgproc.isContourConvex(MatOfPoint(*approxContour.toArray()))

    // 컨벡스라면 도형위에 Convex라고 마킹, 아니면 Concave로 마킹
    if(isConvex){
        Imgproc.putText(src, "Convex",center,Imgproc.FONT_HERSHEY_SIMPLEX, 1.0, RED)
    }else{
        Imgproc.putText(src, "Concave",center,Imgproc.FONT_HERSHEY_SIMPLEX, 1.0, RED)
    }
}
카테고리: OpenCV

0개의 댓글

답글 남기기

Avatar placeholder

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