Python과 OpenCV – 19 : 이미지의 등치선(Contours) – 5/5

이 글은 https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_contours/py_contours_hierarchy/py_contours_hierarchy.html#contours-hierarchy 를 참조로 하였습니다.

먼저 다음과 같은 코드가 있습니다.

import numpy as np
import cv2

img = cv2.imread('./data/opencv_contour_h.png')
imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgray, 127, 255,0)

_, contours,hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

print(hierarchy)
cv2.imshow('img', img)

for i in range(len(contours)):
    cv2.waitKey()
    img = cv2.drawContours(img, contours, i, (0,0,255), 2)
    cv2.imshow('img', img)

print('END')
cv2.waitKey()
cv2.destroyAllWindows()

8번 코드의 cv2.findContours 함수의 2번째 인자에 따라 그 결과가 달라지는데, 특히 반환값 중 3번째인 hierarchy 값이 크게 달라집니다. hierarchy 값은 추출된 등치선 간의 계층 정보를 나타냅니다. cv2.findContours 함수의 2번째 인자에 따라 어떻게 변경되는지 요약 그림을 언급하는 선에서 정리합니다.

먼저 cv2.RETR_LIST 일 경우, 추출된 등치선의 인덱스 번호에 대한 그림입니다.

그리고 반환된 계층 정보는 다음과 같습니다.

[[[ 1 -1 -1 -1]
  [ 2  0 -1 -1]
  [ 3  1 -1 -1]
  [ 4  2 -1 -1]
  [ 5  3 -1 -1]
  [ 6  4 -1 -1]
  [ 7  5 -1 -1]
  [ 8  6 -1 -1]
  [-1  7 -1 -1]]]

총 9개의 등치선이 추출되었으므로 위와 같이 총 9개의 계층 정보가 반환되는데 위의 각 9개 요소의 순서는 앞선 그림에서 표시된 등치선의 인덱스 순서와 동일합니다. 0부터 시작하고요. 그리고 각 요소는 다시 4개로 구성되는데.. [Next, Previous, First_Child, Parent]와 같습니다. 즉, [다음 등치선의 인덱스, 이전 등치선의 인덱스, 첫번째 자식 등치선의 인덱스, 부모 등치선의 인덱스] 입니다. 위의 계층 정보에 대한 내용은 다음 그림으로 표시될 수 있습니다.

다음은 cv2.RETR_EXTERNAL 인자에 대한 등치선의 인덱스 번호에 대한 그림입니다.

계층 정보는 다음과 같습니다.

[[[ 1 -1 -1 -1]
  [ 2  0 -1 -1]
  [-1  1 -1 -1]]]

위 계층정보의 의미는 다음과 같습니다.

다음은 cv2.RETR_CCOMP 인자에 대한 등치선의 인덱스 번호에 대한 그림입니다.

계층 정보는 다음과 같습니다.

[[[ 3 -1  1 -1]
  [ 2 -1 -1  0]
  [-1  1 -1  0]
  [ 5  0  4 -1]
  [-1 -1 -1  3]
  [ 7  3  6 -1]
  [-1 -1 -1  5]
  [ 8  5 -1 -1]
  [-1  7 -1 -1]]]

위 계층정보의 의미는 다음과 같고요.

마지막으로 cv2.RETR_TREE 인자에 대한 등치선의 인덱스 번호에 대한 그림입니다.

계층 정보는 다음과 같습니다.

[[[ 7 -1  1 -1]
  [-1 -1  2  0]
  [-1 -1  3  1]
  [-1 -1  4  2]
  [-1 -1  5  3]
  [ 6 -1 -1  4]
  [-1  5 -1  4]
  [ 8  0 -1 -1]
  [-1  7 -1 -1]]]

위의 계층정보의 의미를 도식화하면 다음과 같습니다.

맵을 이용한 정보 공유, 맵 커뮤니케이터 기능 소개

지도를 활용하여 정보를 공유하고, 업무에 효율적으로 활용할 수 있는 맵 커뮤니케이터 기능에 대한 소개입니다. 맵 커뮤니케이터, 의미 그대로 지도를 이용한 의사소통 기능이고 NexGen에서 제공하는 기능입니다.

맵 커뮤니케이터에서 제공하는 기능은 대화를 기본으로 지도를 활용한 위치 공유, 지도 위에 스케치한 정보 공유 기능입니다. 그리고 다양한 파일을 공유할 수 있는데, 대용량의 파일도 문제 없이 공유할 수 있습니다.

아래는 시연 영상인데요, 교통사고를 주제로하여 구성해 보았습니다.

지도를 이용해 함께 분석하고 그 결과를 바로 공유할 수 있는 기능이 업무에 효과적일 수 있습니다.

아래는 NexGen 시스템의 구성에 대한 이해를 돕기 위한 간단한 구성도인데요.

NexGen은 하나의 완성된 솔루션으로써 미들웨어인 GeoService-Xr와 클라이언트 GIS 엔진인 FingerEyes-Xr로 개발되어 있습니다. NexGen은 IE, Chrome 등과 같은 웹브라우져에서 무리없이 실행됩니다. 속도면에서는 Chrome을 권장합니다. GeoService-Xr은 GS인증을 받은 제품으로 공간 데이터 서비스, 공간 분석 서비스, 맵 커뮤니케이터 서비스 등을 제공하며 빠른 속도와 서버 프로그램으로써의 안정성이 뛰어납니다. FingerEyes-Xr은 웹 GIS 엔진으로써 오픈소스로 GitHub에 공개되어 있습니다. 편집 기능와 미려한 지도 표출 기능 등이 유사한 제품에 비교하여 뛰어납니다.