프로그래밍 / C++ / 언리얼

Programming/Python

[Python] OpenCV 예제로 무작정 따라하기

아트성 2023. 6. 16. 17:04

개요

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)

summer.png
0.46MB

 

위의 코드를 실행시키면 윈도우창이 실행되면서 사진이 나타난다.

 

특정 키를 누르고 창을 종료시키면 이미지가 저장된다.

 

 

도형

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