OpenCV 시작하기

InSung-Na·2023년 5월 2일
1

Part 11. OpenCV

목록 보기
2/6
post-thumbnail

해당 글은 제로베이스데이터스쿨 학습자료를 참고하여 작성되었습니다

OpenCV

1. OpenCV 특징과 구성

Opencv 특징

공식사이트 : http://www.opencv.org
도움말사이트 : https://docs.opencv.org/4.x

  • BSD/Apache 2 라이센스 : 학술 및 상업용 무료
  • 다중인터페이스 : C, C++, Python, Java, JavaScript, MATLAB
  • 다중 플랫폼 : Windows, Linux, Mac OS, iOS, Android
  • 최적화 : CPU 명령, 멀티 코어 프로세싱, OpenCL, CUDA
  • 인기 : 1,800만 다운로드 이상
  • 용도 : 스트리트 뷰 이미지 스티치, 침입 탐지, 내 것 모니터링 장비, 로봇이 물체를 탐색하고 줍는 것을 돕는 것, 인터랙티브 아트 등.

OpenCV 모듈

  • 메인 모듈(main modules): Core, widely used, infrastructures

  • 추가 모듈(extra modules): Brand new, unpopular, non-free, HW dependency, etc.

  • 메인모듈 설명

OpenCV 구성

2. OpenCV 사용해보기

영상파일 읽기(Python)

import cv2
import sys

img = cv2.imread("./data/cat.bmp")  # 데이터 읽기
if img is None:
    print("Image load Failed!!")    # 이미지를 못 찾으면 출력
    sys.exit()

cv2.namedWindow("image")            # "image"라는 이름의 창 생성
cv2.imshow("image", img)            # "image" 창에 img 보여주기
cv2.waitKey()                       # 입력대기, 이미지 창에 문자입력

cv2.destroyAllWindows()             # 모든 창 종료

영상 파일 불러오기

cv2.imread(filename, flage=None)

  • filename : 불러올 파일 이름(문자열)
  • flags : 파일 불러오기 옵션 플래그
    - cv2.IMREAD_COLOR : RGB로 읽기(Default), (rows, cols, 3)
    • cv2.IMREAD_GRAYSCALE : 흑백으로 읽기, (rows, cols, 1)
    • cv2.IMREAD_UNCHANGED : 파일 속성 그대로 읽기, 투명한 PNG파일(rows, cols, 4)
  • retval(return value) : 불러온 영상 데이터(numpy.ndarray)

영상 파일 저장하기

cv2.imwrite(filename, img, params=None)

  • filename : 저장할 파일 이름(문자열)
  • img : 저장할 데이터(numpy.ndarray)
  • params : 파일 저장 옵션 지정(속성 & 값의 정수)
  • retval : 저장여부 True or False

새 창 만들기

cv2.namedWindow(winname, flags=None)

  • winname : 창 고유 이름(문자열)
  • flags : 창속성 지정 플래그
    - cv2.WINDOW_NORMAL : 영상 크기를 창 크기에 맞게 지정, 크기변경가능
    • cv2.WINDOW_AUTOSIZE : 창 크기를 영상 크기에 맞게 변경(Default), 크기변경불가

창 닫기

cv2.destroyWindow(winname)
cv2.destroyAllWindows()

  • winname : 닫으려는 창의 이름
  • cv2.destroyWindow() : 지정한 창 닫기
  • cv2.destroyAllWindows() : 열려있는 모든 창 닫기

영상 출력하기

cv2.imshow(winname, mat)

  • winname : 영상 출력할 대상 창 이름
  • mat : 출력할 영상 데이터
  • 참고사항
    - uint16, int32 자료형 행렬의 경우, 행렬 원소 값을 255로 나눠서 출력
    - float32, float64 자료형 행렬의 경우, 행렬 원소 값에 255를 곱해서 출력
    - 만약 winname에 해당하는 창이 없으면 창을 새로 만들어서 영상을 출력함
    - Windows 운영체제에서는 Ctrl + C (복사), Ctrl + S (저장) 지원
    - 실제로는 cv2.waitKey() 함수를 호출해야 화면에 영상이 나타남

키보드 입력 대기

cv2.waitKey(delay=None)

  • delay : millisecond단위 대기 시간. delay$<=$0이면 무한대기
  • retval : 눌린 키 값(ASCII code). 값이 없으면 -1
  • 참고사항
    - cv2.waitKey()함수는 OpenCV창이 하나라도 있을 때 동작함
    • 특정 키 입력을 확인하려면 ord()함수를 이용해서 변환할 것
    • 주요 특수키 코드: 27(ESC), 13(ENTER), 9(TAB)

이미지 출력(Python)

import cv2
import sys

img1 = cv2.imread("./data/cat.bmp")  # 데이터 읽기
img2 = cv2.imread("./data/cat.bmp", cv2.IMREAD_GRAYSCALE)  # 데이터 읽기
if img1 is None or img2 is None:
    print("Image load Failed!!")    # 이미지를 못 찾으면 출력
    sys.exit()

cv2.namedWindow("Truecolor", flags=cv2.WINDOW_NORMAL) # "Truecolor" 창 생성
cv2.imshow("Truecolor", img1)       # "Truecolor" 창에 img1 보여주기
cv2.namedWindow("Grayscale")        # "Grayscale" 창 생성
cv2.imshow("Grayscale", img2)       # "Grayscale" 창에 img2 보여주기

cv2.imwrite("cat_grayscale.png", img2) # "cat_grayscale.png"로 img2를 저장

while cv2.waitKey() == ord("q"):    # "q" 입력대기
    break

cv2.destroyAllWindows()             # 모든 창 종료

3. Matplotlib으로 출력하기

컬러 영상 출력하기

  • OpenCV는 BGR순서
  • plt는 RGB순서
    -> cv2.cvtColor() 함수로 색상 순서 변경 필요
img = cv2.imread('cat.bmp')
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()

흑백 영상 출력하기

  • plt.imshow()함수에서 cmap="gray"로 지정해야 함
img = cv2.imread("cat.bmp", cv2.IMREAD_GRADYSCALE)
plt.imshow(img, cmap='gray')
plt.show()

컬러별 영상 출력(Python)

import cv2
import matplotlib.pyplot as plt

imgBGR = cv2.imread('cat_truecolor.png')
imgRGB = cv2.cvtColor(imgBGR, cv2.COLOR_BGR2RGB)
imgGRAY = cv2.imread('cat_truecolor.png', cv2.IMREAD_GRAYSCALE)

plt.figure(figsize=(12, 3))

# BGR
plt.subplot(131)
plt.axis("off")
plt.imshow(imgBGR)
plt.title("imgBGR")

# RGB
plt.subplot(132)
plt.axis("off")
plt.imshow(imgRGB)
plt.title("imgRGB")

# GRAY
plt.subplot(133)
plt.axis("off")
plt.imshow(imgGRAY, cmap="gray")
plt.title("imgGRAY")

plt.show()

0개의 댓글