logo

[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() # 카메라 해제
Previous
이미지 파일의 형식