When will you grow up?

python으로 시작하는 OpenCV (1) 본문

02. Study/Computer Vision(openframworks&opencv)

python으로 시작하는 OpenCV (1)

미카이 2020. 2. 2. 20:35

컴퓨터 비전은 우리가 눈으로 보는것처럼 컴퓨터에 시각을 부여해 이미지를 분석함으로써 유용한 정보를 생성하는 기술이다. 컴퓨터 로봇 등을 통해 얼굴, 건물, 의료 등의 다양한 도움을 준다. 또한 인공지능 기술이 발전하면서 인식, 검출, 분할 등 기술의 진화 속도가 엄청나께 빠르게 발전하고 있다.

 

개인적인 공부를 통해 최종적으로는 SLAM(simultaneous localization and mapping) 기술을 습득하는것을 목표로 한다.

또한, 간단한 기본 예제부터 좀 더 심화된 예제를 다뤄보면서 기본기를 익히면서 진행하고 복습차원에서 블로그로 내용을 정리한다.

 

window or ubuntu 환경을 이용하고 conda 환경을 통해 실습을 진행할 예정이다.

설치는 conda propmt에서 pip install opencv-contrib-python or pip install opencv-python 으로 간단하게 설치가 가능하다.

 

첫번째로 다뤄볼 내용은 입출력 기능과 관련된 기본적인 OpenCV 기능을 다뤄본다.

 

1. 파일에서 이미지 읽어오기

아무 이미지나 가져와서 읽어본다.

여기서는 대표적인 rena이미지를 출력해보겠다.

ex)

# gui_opencv.py

import argparse

import cv2

 

parser = argparse.ArgumentParser()

parser.add_argument('--path', default='image.jpg', help='Image path.')

params = parser.parse_args()

img = cv2.imread(params.path)

assert img is not None # 로딩 제대로 된지 확인 

cv2.imshow('window', img)

cv2.waitKey(0) # 아무키나 입력 받기전까지 대기하고 입력받으면 window창 종료
cv2.destroyAllWindows()

 

 

print(f'read {params.path}') #read image.jpg

print(f'shape :{img.shape}') # shape :(225, 225, 3)

print(f'dtype :{img.dtype}') # dtype :unint8

# print('read {}'.format(params.path)) or print('read ', params.path) 로 출력이 가능한데, 가독성을 위해 위와 같이 표현한다.

cs

 

만약 prompt를 이용해서 실행하시는 분이라면 해당 프로젝트 파일안에, image파일이 있으신 분은 아무값도 없이 넣어도 되지만 아니라면 절대경로나 상대경로를 argument 값으로 실행시키면 된다.

ex) python gui_opencv.py --path 'images.jpg'   # ''안에 이미지 경로를 넣어주면 된다.

 

간단하지만 코드를 살펴보자면, imread 함수를 살펴보면 선택적 플래그도 지원하며, uint8(unsigned 8) 타입으로 변환 등 다양한 형태를 지정할 수 있다.

cv2.imread('path', 0) # grayscale,  1은 color, -1은 원본 그대로 ~_~ 만약 뒤에 인자값을 안준다면 기본 디폴트로 3채널(color)로 읽게 된다.

또한, (height, width, channel) 형태의 numpy 형식으로 데이터를 읽어오며 , RGB 형식 대신에 BRG 형식으로 이미지를 로딩한다는 점을 기억하자.

 

 

 

 

 

2. Image Resize & Flip (이미지 사이즈 조절 및 뒤집기)

resize_flip

 

위 이미지와 같이 원본 이미지를 resize하거나, flip하는것도 간단하게 구현이 가능하다.

# resize_flip_basic.py

import cv2

 

width, height = 455455

img = cv2.imread('image.jpg')

resized_img = cv2.resize(img, (width, height))

cv2.imshow('resize_img', resized_img)

 

flip_img = cv2.flip(img, 0)

cv2.imshow('flip_img', flip_img)

cv2.waitKey(0# 아무키나 입력 받기전까지 대기하고 입력받으면 window창 종료

cv2.destroyAllWindows()

cs

위 내용도 간단하게 살펴보면

cv2.resize 함수는 뒤 매개변수로 (width, height)를 줘서 픽셀 단위로 설정을 할 수 있고, 이미지의 원본 너비와 높에 대한 배수를 설정해서 크기를 조정할 수 있다

ex) cv2.resize(img, (0,0), img, 0.25, 0.5) # width로 0.25 쭐이고 height로 반 줄인다.

 

cv2.flip 함수는 뒤 매개변수로 0을 주면 x축을 따라 뒤집고, 1이면 y축을 따라 이미지를 뒤집고, -1이면 x,y축 동시에 뒤집는다.

 

 

 

3. Image Write (이미지 저장)

# write_basic.py

import cv2

img = cv2.imread('image.jpg')

cv2.imwrite('img_compressed.png', img, [cv2.IMWRITE_PNG_COMPRESSION, 0]) # 낮은 압축률로 이미지 저장

cv2.imwrite('img_compressed2.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 0]) # jpg 형식으로 저장 저화질로 저장된걸 확인할 수 있다.

save_img = cv2.imread('img_compressed.png')

assert save_img.all() == img.all() # 원본과 동일한지 비교

 

save_img2 = cv2.imread('img_compressed.jpg')

assert save_img2.all() == img.all() # 원본과 동일한지 비교 오류 발생!

Colored by Color Scripter


cs

보통 우리가 이미지를 저장할때,

cv2.imwrite('path', img) 이런식으로 저장하는데 압축수준이라던지 퀄리티 인자값을 통해 이미지를 저장할 수 있다.

COMPRESSION은 (0,9) 사이의 값을 갖고, 숫자가 클수록 파일 크기는 작지만, 디코딩 프로세스가 느려진다.

QUALITY는 (0,100) 사이의 값으로 설정할 수 있고 값이 클수록 좋은 품질을 의미하므로 큰 값이면 artifact양이 감소한다.

 

그 외에도, 비디오, 프리미티브, 등 다양한 GUI환경을 지원한다.

 

다음 챕터로는 행렬, 색상, 필터를 알아보자!!

 

 

 

 

reference

book : 파이썬과 OpenCV를 이용한 컴퓨터 비전 학습

document : python opencv document

Comments