GIS

QGIS 3: OpenCV 불러오기

유병혁 2021. 5. 7. 00:54

안녕하세요? 이번 글에서는 QGIS 3.0에서 OpenCV를 설정해보도록 하겠습니다.

 

파이썬 3에서 OpenCV를 설정하는 과정인데요, 방법은 아래 글을 참조하였습니다:

Install OpenCV 3.4 in Python 3.6 / 2.7
https://www.scivision.co/install-opencv-python-windows/

 

OpenCV는 '오픈소스 컴퓨터 비전 라이브러리 (Open Source Computer Vision Library)'입니다.

BSD(Berkeley Software Distribution) 라이센스 하에 배포되므로 학술적, 상업적 이용 시 자유롭습니다.

C++, 파이썬, 자바 인터페이스가 있으며 윈도우, 리눅스, 맥 OS, iOS, 안드로이드를 지원합니다.

 

 

OpenCV 공식 홈페이지:https://opencv.org

 

OpenCV는 1999년 인텔이 착수하여 버전 1.0은 2006년, 2.0은 2009년, 3.0은 2015년에 배포되었습니다.
(2018년 3월 16일 기준으로) 현재 최신버전은 지난 2월 27일 출시된 3.4.1입니다.

 

본 글에서는 QGIS 3.0의 OSGeo4W Shell을 통해 OpenCV를 설치해보도록 하겠습니다.

 

아래는 파이썬용 비공식 OpenCV 패키지입니다. OSGeo4W Shell을 '관리자 권한으로 실행'하고 'py3_env' 실행 후, OpenCV 설치는 [1], 추가 모듈을 포함한 OpenCV 설치는 [2]를 입력합니다.

 

[1] opencv-python: https://pypi.python.org/pypi/opencv-python

python -m pip install opencv-python

[2] opencv-contrib-python: https://pypi.python.org/pypi/opencv-contrib-python

python -m pip install opencv-contrib-python

 

아래와 같이 설치가 진행됩니다.

 

 

'numpy>=1.11.3' 요구사항이 이미 만족되었다는 안내가 뜨는데요, QGIS 3.0은 이미 NumPy 1.12.0이 설치되어 있기 때문입니다. 

 

 

이제 아래와 같이 OpenCV를 불러올 수 있습니다. 현재 설치한 버전은 3.4.0입니다.

 

 

이번에는 QGIS 3.0을 실행하고 상단 메뉴에서 '플러그인 > 파이썬 콘솔'을 클릭합니다.

 

 

 

아래와 같이 QGIS 3.0에서 OpenCV를 불러올 수 있습니다. 간단하게 라이브러리를 사용해볼까요?!

 

 

 

저는 대학원 수업에서 배운 '캐니 엣지 탐지(Canny Edge Detection)'를 정사영상에 적용해 보겠습니다.

데이터 소스 관리자를 통해 제가 근무하는 '소백산국립공원북부사무소' 일원의 정사영상을 추가하였습니다.

 

 

파이썬 콘솔에서 사용할 라이브러리(GDAL, NumPy, OpenCV)들을 불러옵니다.

from osgeo import gdal
import numpy as np
import cv2

정사영상 데이터셋을 GDAL로 열고, 첫번째 밴드를 OpenCV가 인식할 수 있도록 배열(array)로 읽어옵니다.

ds = gdal.Open('D:/GEODATA/odm_orthophoto.tif')
band = ds.GetRasterBand(1)
arr = band.ReadAsArray()

 

이제 캐니 엣지 탐지를 적용해 보겠습니다.

Canny Edge Detection: https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_canny/py_canny.html#canny

arr = np.uint8(arr)
edges = cv2.Canny(arr,100,200)

적용결과를 GeoTIFF로 저장하고, iface.addRasterLayer를 통해 QGIS로 불러와 보겠습니다.

driver = gdal.GetDriverByName('GTiff')
out_dsname = "D:/GEODATA/odm_orthophoto_edges.tif"
[cols, rows] = arr.shape
out_ds = driver.Create(out_dsname, rows, cols, 1, gdal.GDT_UInt16)
out_ds.SetGeoTransform(ds.GetGeoTransform())
out_ds.SetProjection(ds.GetProjection())
out_ds.GetRasterBand(1).WriteArray(edges)
out_ds.FlushCache()
out_ds = None
band = None
ds = None
rLayer = QgsRasterLayer(out_dsname, "Edges")
QgsProject.instance().addMapLayer(rLayer)

아래와 같이 OpenCV 라이브러리를 이용한 결과값이 래스터로 생성되었습니다. 공간정보와 컴퓨터비전 라이브러리들을 함께 사용하면 좋겠죠?!