Prerequisite : 윤곽선 길이 구하기
윤곽선 근사화
윤곽선 근사화란 검출한 윤곽선 정보를 분석하여 정점(vertex) 수가 적은 윤곽선 또는 다각형으로 표현할 수 있게 만드는 방법을 의미 한다. 이때 Douglas-Peucker 알고리즘을 사용한다.

OpenCV에서 윤곽선 근사화를 위해 approxPolyDP라는 함수를 제공하고 있다.
approxPolyDP(curve, approxCurve, epsilon, closed)
curve: 입력할 곡선 좌표(윤곽선 좌표)
approxCurve: 함수 호출 후 참조 가능한 근사화 된 곡선 좌표
epsilon: 근사화 정밀도 조절. 입력 곡선과 근사화 곡선 간의 최대 거리.
예) arcLenth(curve) *0.02
closed: 폐곡선 여부. true면 폐곡선
epsilon값을 조절하여 근사화 된 곡선을 얻는 예제를 살펴보자.
예제코드:
val contours = ArrayList<MatOfPoint>()
val hierarchy = Mat()
//윤곽선 찾기
Imgproc.findContours(binarySrc, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE)
for(contour in contours){
// 윤곽선 정보를 MatOfPoint2f타입으로 변환
val contour2f = MatOfPoint2f(*contour.toArray())
// approxPolyDP 호출후 참조할 근사화 된 윤곽선 정보
val approxCurve = MatOfPoint2f()
// 윤곽선 근사화 정보 얻기
Imgproc.approxPolyDP(
contour2f,
approxCurve,
Imgproc.arcLength(contour2f, true)*(0.005*value1),
true
)
val points = approxCurve.toList()
// 근사화 된 윤곽선 정점들을 line 함수를 통해 이어 그리기
for(i in points.indices){
Imgproc.line(src, points[i], points[(i+1)%points.size], RED, 2)
}
}
0개의 댓글