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개의 댓글