####################################################################
##    _______   ___   .______    __    __   _______ .______       ##
##   /  _____| / _ \  |   _  \  |  |  |  | |   ____||   _  \      ##
##  |  |  __  | | | | |  |_)  | |  |__|  | |  |__   |  |_)  |     ##
##  |  | |_ | | | | | |   ___/  |   __   | |   __|  |      /      ##
##  |  |__| | | |_| | |  |      |  |  |  | |  |____ |  |\  \----. ##
##   \______|  \___/  | _|      |__|  |__| |_______|| _| `._____| ##
##                                                                ##
####################################################################
###########################################
##          ___        _                 ##
##         / _ \      | |                ##
##    __ _| | | |_ __ | |__   ___ _ __   ##
##   / _` | | | | '_ \| '_ \ / _ \ '__|  ##
##  | (_| | |_| | |_) | | | |  __/ |     ##
##   \__, |\___/| .__/|_| |_|\___|_|     ##
##    __/ |     | |                      ##
##   |___/      |_|                      ##
##                                       ##
###########################################

[-] g0pher's OpenCV

OpenCV란?

OpenCV는 컴퓨터 비전을 목적으로한 프로그래밍 라이브러리다. 컴퓨터 비전이 목적인 만큼 이미지의 데이터 추출이 강력하다고 한다. 여러 언어의 라이브러리로 존재하는데, 나는 텐서플로우랑 연동하고자 파이썬 기반으로 사용할 예정이다.

OpenCV 설치

OpenCV와 추가적으로 필요한 라이브러리를 아래 명령을 통해 설치한다.

pip install opencv-python
pip install numpy
pip install matplotlib

설치가 완료되면 IDLE를 실행하여 아래와 같은 코드를 입력했을 때, 오류가 안나면 성공적으로 설치된 것이다.

import cv2
import numpy
import matplotlib

만약 오류가 뜬다면 설치할 때 사용한 pip 버전과 IDLE로 실행한 파이썬의 버전이 같은지 확인해보자.

이미지 다루기

이미지 읽기

우선 아래와 같은 코드로 이미지를 읽을 수 있다.

import cv2

def readImage(path):
    flags = [
        cv2.IMREAD_COLOR, # 컬러 이미지 로드
        cv2.IMREAD_GRAYSCALE, # 흑백 이미지 로드
        cv2.IMREAD_UNCHANGED # 알파채널 포함 그대로 로드
    ]
    img = cv2.imread(path, flags[0])
    cv2.imshow("Title", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

readImage("./s0.jpg")

이미지는 cv2의 imread(path, flag)를 통해 로드할 수 있다. 플래그에 대한 추가 설명은 위 주석을 참고하면 된다. 실제로 화면에 띄우기 위해 imshow(windowTitle, readimg)를 이용하면 된다. waitKey(time)은 time동안 키보드 입력을 대기하는 함수다. 키보드 입력이 들어온다면 destroyAllWindows()로 윈도우 창을 종료한다.

그러나 위의 코드는 창 크기가 조절이 안된다. 창 크기를 조절하기 위해 아래와 같이 코드를 짜보자

import cv2

def readImage(path):
    imreadFlags = [
        cv2.IMREAD_COLOR, # 컬러 이미지 로드
        cv2.IMREAD_GRAYSCALE, # 흑백 이미지 로드
        cv2.IMREAD_UNCHANGED # 알파채널 포함 그대로 로드
    ]
    img = cv2.imread(path, imreadFlags[2])

    winsizeFlags = [
        cv2.WINDOW_AUTOSIZE, # 원본 이미지 크기로 고정
        cv2.WINDOW_NORMAL # 원본 이미지 크기지만 조정 가능
    ]
    cv2.namedWindow("Title", winsizeFlags[1])
    
    cv2.imshow("Title", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

readImage("./s0.jpg")

위와 같이 namedWindow(windowTitle, flag)를 이용하면 창 크기를 조절할 수 있다. 이 때, namedWindow의 타이틀과 imshow의 타이틀이 같아야 한다. 다르다면 서로 다른 창으로 분리된다.

Matplotlib 사용하기

이미지를 자세하기 살펴보기 위해 Matplotlib를 사용할 수 있다.

import cv2
from matplotlib import pyplot as plt

img  = cv2.imread("./s0.jpg", cv2.IMREAD_COLOR)

plt.imshow(img)
plt.xticks([])
plt.yticks([])
plt.show()