Skip to main content

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() # 카메라 해제

퀴즈