[computer-vision] OpenCV
OpenCV 소개
- Open-Source Computer Vision Library의 약자
- 전통적 영상 처리와 컴퓨터 비전 관련 오픈 소스 라이브러리
- 2,500개 이상의 알고리즘으로 구성
- C++로 작성되었지만, Python, Java, MATLAB 등 다양한 언어에서 사용할 수 있음
주요 기능
- 이미지 처리: 필터링, 엣지 감지, 히스토그램 등 다양한 이미지 처리 작업을 지원
- 동영상 분석: 동영상에서 객체 추적, 배경 제거 등을 할 수 있으며, 카메라로부터 실시간 영상을 처리할 수 있음
- 머신러닝: 얼굴 인식, 객체 탐지, 장면 분류 등 다양한 머신러닝 알고리즘을 제공
- 3D 비전: 스테레오 카메라, 깊이 지도, 포인트 클라우드 등의 기능을 지원
OpenCV 설치 및 임포트
설치
pip install opencv-python
임포트
import cv2 as cv
# import cv2: OpenCV를 불러들임
# as cv: 원래 이름은 cv2지만 cv로 부름
파일 열기
파일 열기
image_path = 'balloon.webp'
image = cv.imread(image_path)
이미지 크기: (가로, 세로, 채널 수)
- 컬러 이미지의 경우 채널 수는 RGB, 3개
image.shape
이미지를 이루는 점의 개수
이미지를 이루는 점의 개수
image.size
직접 계산
image.shape[0] * image.shape[1] * image.shape[2]
넘파이로 계산
import numpy as np
np.product(image.shape) # shape을 이루는 모든 수를 곱함
이미지의 자료형
자료형 보기
image.dtype
OpenCV에서 주로 사용하는 자료형
uint8: 부호가 없는(unsigned) 정수(integer) 8bit- 그레이스케일 이미지나 색상 이미지(BGR)에서 픽셀 값을 표현할 때 사용
- 0~255 범위의 이미지 픽셀 값
float32: 부동소수점(floating point) 32bit- 이미지를 실수로 표현(0.0~1.0 또는 -1.0 ~ +1.0)
- 머신러닝 등으로 처리할 때 주로 사용
이미지 보기
OpenCV로 불러온 이미지는 배열이어서 주피터 노트북에서는 이미지를 구성하는 수들만 보임 PIL의 이미지 형식으로 바꾸면 이미지로 볼 수 있음
단, 색상 순서가 OpenCV는 청록적(BGR)이고 PIL은 적록청(RGB)이므로 맞게 바꿔줌
from PIL import Image # Pillow 라이브러리 임포트
def show(image):
# OpenCV 형식의 image를 PIL로 바꿔주는 함수
rgb = cv.cvtColor(image, cv.COLOR_BGR2RGB) # BGR → RGB로 채널 순서 변경
return Image.fromarray(rgb) # 객체 변환: 넘파이 배열 → PIL 형식으로
show(image)
PIL 이미지를 넘파이 배열로 변환
PIL 이미지에서 넘파이 배열(OpenCV가 사용하는 형식)로 바꾸는 방법
import numpy as np
pil_img = Image.open(image_path) # Pillow로 파일을 연다
array = np.array(pil_img) # 배열로 변환
array = cv.cvtColor(array, cv.COLOR_RGB2BGR) # 채널 순서 바꿈
비디오 처리
비디오 열기
video = cv.VideoCapture('자전거.mp4')
초당 프레임 수
fps = video.get(cv.CAP_PROP_FPS)
1 프레임 간격(밀리초=1/1000초 단위)
frame_interval = int(1000 / fps)
비디오 재생
while(video.isOpened()): # 파일이 열려있는 동안
ret, frame = video.read() # 한 프레임 읽음
if not ret: # 없으면
break # 중단
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) # 흑백으로
cv.imshow('frame', gray) # 출력
if cv.waitKey(frame_interval) == ord('q'): # 키 입력을 기다림, q가 입력되면
break # 중단
video.release() # 파일 닫음
cv.destroyAllWindows() # 창 닫음
웹캠 캡처
video = cv.VideoCapture(0) # 캡처 준비
# 캡처할 이미지의 폭을 640으로 설정, 높이를 480으로 설정
video.set(cv.CAP_PROP_FRAME_WIDTH, 640)
video.set(cv.CAP_PROP_FRAME_HEIGHT, 480)
# 캡처
ret, img = video.read()
# ret: 성공 여부
# img: 캡처된 이미지(넘파이 배열)
video.release() # 카메라 해제