개요
OpenCV는 이미지 및 동영상 분석을 위한 오픈 소스 라이브러리로, 기본적인 이미지 처리부터 고급 컴퓨터 비전, 기계 학습 기법까지 활용 가능하며, 얼굴 및 객체 인식, OCR, 태그 분석 등의 다양한 기능을 제공한다.
이는 필터링, 기하학적 변환, 색상 공간 변환, 히스토그램, 특징 검출 및 설명등이 있지만 이중에서 가장 많이 쓰이는 부분은 영상처리다. 입력된 이미지를 개선하여 목적에 맞게 변형하는 과정으로, 잡음 제거, 대비 개선, 관심 영역 강조, 영역 분할, 압축 및 저장 등을 포함한다.
OpenCV의 영상처리 기술은 의료분야(CT, MRI), 자율주행(Visual Sensor), 보안(얼굴인식), 항공우주산업 등 다양한 분야에 쓰인다. 예제를 통해서 어떤방식으로 기능구현되는지 알아보도록한다.
이미지
OpenCV는 이미지와 비디오를 분석하고 처리하는 데 다양한 기능을 제공한다.
이미지 변환, 객체검출 & 인식, 객체 인식, 히스토그램등 다양하게 응용해서 사용할 수 있다.
이미지 읽기
cv2.imread(file_name, flag)
# file_name : 읽고자 하는 이미지 파일
# flag : 이미지를 읽는 방법 설정
# IMREAD_COLOR : 이미지를 Color로 읽고, 투명한 부분은 무시
# IMREAD_GRAYSCALE : 이미지를 Grayscale로 읽기
# IMREAD_UNCHANGED : 이미지를 Color로 읽고, 투명한 부분도 읽기 (Alpha)
#Return값 : Numpy 객체 (행, 열, 색상 BGR)
이미지 전환
img_converted = cv2.cvtColor(img, flag)
# img : 이미지를 표현하는 2차원 또는 3차원 numpy 배열
# flag : 이미지를 읽는 방법 설정
# COLOR_BGR2GRAY : BGR 색상 공간에서 그레이스케일로 변환
# COLOR_GRAY2BGR : 그레이스케일에서 BGR 색상 공간으로 변환
# COLOR_BGR2HSV : BGR 색상 공간에서 HSV로 변환
# COLOR_HSV2BGR : HSV에서 BGR 색상 공간으로 변환
# COLOR_BGR2RGB : BGR 색상 공간에서 RGB로 변환
# COLOR_RGB2BGR : RGB에서 BGR 색상 공간으로 변환
# COLOR_BGR2YCrCb : BGR 색상 공간에서 YCrCb로 변환
이미지 출력
cv2.imshow(title, image)
# title : 윈도우 창의 제목
# image : 출력할 이미지 객체
이미지 저장
cv2.mwrite(file_name, image)
# file_name : 저장할 이미지 파일 이름
# image : 저장할 이미지 객체
키보드 입력
cv2.waitKey(time)
# time : 입력 대기시간 (무한대기 : 0)
# 반환 값 : 사용자가 입력한 Ascii Code (ESC : 27)
윈도우 종료
cv2.destroyAllWindows()
예제1 ) 이미지 실행 & 저장
import cv2
img_rgb = cv2.imread('summer.png', cv2.IMREAD_COLOR)
cv2.imshow('Image', img_rgb)
cv2.waitKey(0)
cv2.imwrite('result.png', img_rgb)
위의 코드를 실행시키면 윈도우창이 실행되면서 사진이 나타난다.
특정 키를 누르고 창을 종료시키면 이미지가 저장된다.
도형
OpenCV는 다양한 도형을 이미지 위에 그릴 수 있는 기능을 제공한다.
직선, 사각형, 원, 타원, 폴리곤등 다양한 기능을 제공한다. 그중 가장 많이쓰이는 직선, 사각형, 원 관련 함수를 알아보자.
직선 그리기
cv2.line(img, startLinePos, endLinePos, color, thickness)
# img (numpy.ndarray) : 이미지를 표현하는 2차원 또는 3차원 numpy 배열.
# startLinePos (tuple) : 선의 시작점 좌표. (x, y) 형태의 튜플.
# endLinePos (tuple) : 선의 종료점 좌표. (x, y) 형태의 튜플.
# color (tuple) : 선의 색상. RGB 모드일 경우 (B, G, R) 형태의 튜플, 회색조 모드일 경우 스칼라 값.
# thickness (int) : 선의 두께. 픽셀 단위의 양의 정수. 디폴트 값은 1.
사각형 그리기
cv2.rectangle(img, startRectanglePos, endRectanglePos, color, thickness)
# img (numpy.ndarray) : 이미지를 표현하는 2차원 또는 3차원 numpy 배열.
# startLinePos (tuple) : 사각형의 시작점 좌표. (x, y) 형태의 튜플.
# endLinePos (tuple) : 사각형의 종료점 좌표. (x, y) 형태의 튜플. 시작점에서 대각선 방향으로 봤을 때 위치.
# color (tuple) : 선의 색상. RGB 모드일 경우 (B, G, R) 형태의 튜플, 회색조 모드일 경우 스칼라 값.
# thickness (int) : 선의 두께. 픽셀 단위의 양의 정수. 디폴트 값은 1. 채우기는 -1
원 그리기
cv2.circle(img, center, radius, color, thickness)
# img (numpy.ndarray) : 이미지를 표현하는 2차원 또는 3차원 numpy 배열.
# center (tuple) : 원의 중심 좌표. (x, y) 형태의 튜플.
# radois (int) : 원의 반지름. 픽셀 단위의 양의 정수.
# color (tuple) : 원의 색상. RGB 모드일 경우 (B, G, R) 형태의 튜플, 회색조 모드일 경우 스칼라 값.
# thickness (int) : 선의 두께. 픽셀 단위의 양의 정수. 디폴트 값은 1. 채우기는 -1
예제2 ) 도형 그리기
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = np.zeros((512, 512, 3), np.uint8)
img = cv2.line(img, (0, 512), (512, 0), (255, 0, 0), 5)
img = cv2.rectangle(img, (150, 150), (350, 350), (0, 255, 0), 3)
img = cv2.circle(img, (400, 100), 50, (0, 0, 255), 4)
cv2.imshow('Image', img)
cv2.waitKey(0)
도형을 채우고 싶으면, 5번째 파라미터인 thickness를 -1로 바꿔주면 된다.
텍스트
텍스트 그리기
cv2.putText(img, text, org, fontFace, fontScale, color, thickness, lineType, bottomLeftOrigin)
# img (numpy.ndarray) : 텍스트를 그릴 대상 이미지. 이미지는 2차원 또는 3차원 numpy 배열
# text (str) : 이미지에 그릴 텍스트 문자열.
# org (tuple) : 텍스트가 시작될 좌표. 좌표는 (x, y) 형태의 튜플, 왼쪽 하단을 기준
# fontFace (int) : 글꼴 타입.
# FONT_HERSHEY_SIMPLEX (0) : 기본 글꼴
# FONT_HERSHEY_PLAIN (1) : 얇은 기본 글꼴
# FONT_HERSHEY_DUPLEX (2) : 두꺼운 기본 글꼴
# FONT_HERSHEY_COMPLEX (3) : 복잡한 글꼴
# FONT_HERSHEY_TRIPLEX (4) : 복잡한 두꺼운 글꼴
# FONT_HERSHEY_COMPLEX_SMALL (5) : 복잡한 작은 글꼴
# FONT_HERSHEY_SCRIPT_SIMPLEX (6) : 필기체 스타일 글꼴
# FONT_HERSHEY_SCRIPT_COMPLEX (7) : 복잡한 필기체 스타일 글꼴
# FONT_ITALIC (16) : 이탤릭 스타일 글꼴
# fontScale (float) : 글꼴 크기, 텍스트의 크기를 결정
# color (tuple) : 텍스트의 색상. RGB 모드일 경우 (B, G, R) 형태의 튜플, 회색조 모드일 경우 스칼라 값.
# thickness (int) : 텍스트의 두께. 픽셀 단위의 양의 정수. 디폴트 값은 1.
# lineType (int) : 선의 타입. 디폴트는 cv2.LINE_8. 다른 선택 가능한 값으로 cv2.LINE_4, cv2.LINE_AA.
# bottomLeftOrigin (bool) : True일 경우 왼쪽하단, False일 경우 왼쪽상단이 원점.
예제3 ) 텍스트 그리기
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = np.zeros((512, 512, 3), np.uint8)
img = cv2.putText(img, 'Python', (10, 250), 0, 4, (0, 255, 255), 3)
cv2.imshow('Image', img)
cv2.waitKey(0)
'Programming > Python' 카테고리의 다른 글
[Python] OpenCV 메서드 정리 (2) | 2023.06.24 |
---|---|
[자율주행] 자율주행의 현주소와 기술들 (0) | 2023.06.20 |