Prerequisite : 윤곽선 길이 구하기
Convex 검사
Convex 검사는 주어진 윤곽선이 볼록한지 여부를 확인하는 것을 말한다.
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) } }
0개의 댓글