개발하는 삶

[Python] NumPy, OpenCV(이미지 처리), PIL 본문

JavaScript, Vue.js, CSS/Python&Django

[Python] NumPy, OpenCV(이미지 처리), PIL

삶_ 2023. 1. 17. 14:01

 

 

NumPy

  • C언어로 구현된 수치 계산을 돕는 파이썬 라이브러리
  • 배열 정의, 크기 확인 등
import numpy as np

# 배열 np화 하기
data = [1,2,3,4]
array1 = np.array(data)

# 배열의 크기
array1.shape

# openCV로 이미지를 불러올 때, BGR 형태로 변환해 가져옴. 따라서 RGB로 변환 필요.
# COLOR_RGB2BGR : 컬러 버전
cv2.cvtColor(np.array(frame), cv2.COLOR_RGB2BGR)

 

 

PIL

  • openCV 와 달리, PIL은 이미지가 가지고 있는 형식(RGB 등) 그대로를 가져옴.
  • 글씨체 변경, 이미지화해서 한글 폰트 출력해주는 라이브러리.
  • opencv는 한글 폰트를 지원해주지 않음. 따라서 이미지화 해줄수 있는 기능이 필요.
from PIL import ImageFont, ImageDraw, Image

# cv2 로 읽은 이미지는 numpy 배열이 되기 때문에, 상황에 따라 PIL 이미지 버전으로 바꿔주는 것.
Image.fromarray()
# 이미지 그려내는 도구
draw = ImageDraw.Draw()
# 폰트 종류/크기 지정
font_style = ImageFont.truetype("fonts/malgunbd.ttf", 20)
# 폰트 좌표/색/종류 지정
draw.text((733,45), "안녕", fill=(0,0,0), font=font_style)

 

  • PIL ↔ NumPy 변환
    • PIL 이미지로 변환 ▶ Numpy 배열 : np.array(), np.asarray()
    • Numpy 배열 ▶ PIL 이미지로 변환 : Image.fromarray()
# PIL 이미지로 변환 -> Numpy 배열
np.array(img)

# Numpy 배열 -> PIL 이미지로 변환
Image.fromarray(np.array(img))

 

 

opencv로 동영상 불러오기

  • 프레임으로 불러오는 기능
import cv2

# 동영상 불러오기
vd = cv2.VideoCapture('동영상.mp4')

# 동영상 객체가 준비됬는지 확인
if vd.isOpened():
	# get() : 비디오 속성값 확인
	vd.get(cv2.CAP_PROP_FPS) # 초당 프레임 수
	vd.get(cv2.CAP_PROP_FRAME_COUNT) # 동영상 총 프레임 수
	vd.get(cv2.CAP_PROP_FRAME_WIDTH) # 동영상 가로길이
	vd.get(cv2.CAP_PROP_FRAME_HEIGHT) # 동영상 세로길이

# 동영상 프레임 받아오기
While True :
	# 동영상 현재 프레임 받아오기 : read()
	# ret (받아왔는지 True/False)
	# frame (현재 프레임)
	ret, frame = vd.read()

# 동영상 사용 종료
vd.release()
# 열린 모든 창을 종료
cv2.destroyAllWindows()

 

  • 화면에 도형 추가(직사각형)
# frame : 불러온 이미지 혹은 영상 프레임
# 첫 좌표에서 두번째 좌표까지 도형이 그려짐.
# 세번째는 색, 네번째는 도형선굵기. -1 은 전체 색 채우기.
cv2.rectangle(frame, (100,100), (int(f_width)-1300,750), (255, 255, 255), -1)

 

  • 이미지/영상의 크기 변환
# frame : 영상/이미지
# (가로,세로) : 이미지 크기
cv2.resize(frame, (100, 100))

 

  • 이미지 화면 출력. 그 외.
# 이미지 화면 출력
cv2.imshow('이미지 창이름', 파일명)

# 다음 이미지/프레임을 기다리는 시간 (영상이라면 10 이상 해두기)
cv2.waitKey(10)