지난 포스팅에서 윤곽선 검출 함수 findContours() 를 통해 윤곽선을 검출하는 방법에 대해 알아보았다.

이 포스팅에서는 검출한 윤곽선 정보를 가지고 윤곽선의 길이를 구하는 함수에 대해서 알아본다.

윤곽선 길이 구하기

Imgproc.arcLength(contour, closed)

contour: 윤곽선 정보(좌표)
closed: true면 폐곡선
반환값: 윤곽선의 길이

arcLength 함수를 사용하는 가장 긴 외곽선만 검출하는 예제를 만들어보자.

원본
가장 긴 윤곽선을 검출 (둘레 896px)
val contours:ArrayList<MatOfPoint> = ... // findContours로 검출한 윤곽선 정보
var longest = 0.0 // 가장 긴 윤곽선 길이를 저장
var longestContourIdx = -1; // contours에서 가장 긴 윤곽선의 index를 저장

for (i in 0 until contours.size) {
    // 윤곽선 길이 구하기
    val perimeter = Imgproc.arcLength(MatOfPoint2f(*contours[i].toArray()), true)
    // 가장 긴 윤곽선인지 검사
    if (perimeter > longest) {
        longest = perimeter
        longestContourIdx = i
    }
}
if (longestContourIdx != -1) {
    // 원본위에 빨간 윤곽선 그리기
    Imgproc.drawContours(
        src,
        contours,
        longestContourIdx,
        RED,
        5,
        Imgproc.LINE_8,
        hierarchy,
        0
    )
    // 윤곽선 길이 텍스트뷰에 출력
    result = String.format("perimeter = %.2f", longest)
}

Tip : findContours 함수로 찾은 윤곽선들의 정보는 MatOfPoint 타입이다. arcLength의 경우 매개변수로 MatOfPoint2f 타입을 요구한다. 이 경우, MatOfPoint를 MatOfPoint2f로 다음과 같이 변경할 수 있다.

val contour: MatOfPoint = …
val contour2f: MatOfPoint2F = MatOfPoint2f(*contour.toArray())

카테고리: OpenCV

0개의 댓글

답글 남기기

Avatar placeholder

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