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