지난 포스팅에서 윤곽선 검출 함수 findContours() 를 통해 윤곽선을 검출하는 방법에 대해 알아보았다.
이 포스팅에서는 검출한 윤곽선 정보를 가지고 윤곽선의 길이를 구하는 함수에 대해서 알아본다.
윤곽선 길이 구하기
Imgproc.arcLength(contour, closed)
contour: 윤곽선 정보(좌표)
closed: true면 폐곡선
반환값: 윤곽선의 길이
arcLength 함수를 사용하는 가장 긴 외곽선만 검출하는 예제를 만들어보자.
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())
0개의 댓글