Skip to content

Latest commit

 

History

History
164 lines (134 loc) · 5.19 KB

220123.md

File metadata and controls

164 lines (134 loc) · 5.19 KB

Day 104

이미지 처리

OpenCV(Computer Vision)

다양한 영상(이미지) / 동영상 처리에 사용되는 오픈소스 라이브러리

1. 이미지 출력

import cv2
img = cv2.imread('img.jpg') # 해당 경로의 파일 읽어오기
cv2.imshow('img', img)      # img라는 이름의 창에 img를 표시
cv2.waitKey(0)              # 지정된 시간 동안 사용자 키 입력 대기, 단위는 ms, 0이면 계속 대기
# key = cv2.waitKey(0)이면 key에 입력한 키의 아스키 코드 값이 들어간다.
cv2.destroyAllWindows()     # 모든 창 닫기

읽기 옵션

  1. cv2.IMREAD_COLOR : 컬러 이미지, 투명 영역은 무시(기본값)
  2. cv2.IMREAD_GRAYSCALE : 흑백 이미지
  3. cv2.IMREAD_UNCHANGED : 투명 영역까지 포함
img_color = cv2.imread('img.jpg', cv2.IMREAD_COLOR)
img_gray = cv2.imread('img.jpg', cv2.IMREAD_GRAYSCALE)
img_unchanged = cv2.imread('img.jpg', cv2.IMREAD_UNCHANGED)

cv2.imshow('img_color', img_color)
cv2.imshow('img_gray', img_gray)
cv2.imshow('img_unchanged', img_unchanged)

cv2.waitKey(0)
cv2.destroyAllWindows()

img_options

Shape

이미지의 height, width, channel 정보

img = cv2.imread('img.jpg')
img.shape # 세로, 가로, Channel
**수행결과**
(427, 640, 3)

2. 동영상 출력

동영상 파일 출력

cap = cv2.VideoCapture('video.mp4')

while cap.isOpened(): # 동영상 파일이 올바로 열렸는지?
    ret, frame = cap.read() # ret : 성공 여부, frame : 받아온 이미지(프레임)
    if not ret:
        print('더 이상 가져올 프레임이 없어요')
        break
    
    cv2.imshow('video', frame)
    
    if cv2.waitKey(25) == ord('q'): # 사용자가 q를 입력하면 종료, waitKey() 안의 숫자를 변경하면 동영상 속도도 변경됨
        print('사용자 입력에 의해 종료합니다.')
        break
        
cap.release() # 자원 해제
cv2.destroyAllWindows() # 모든 창 닫기

실행하면 동영상이 재생되고 재생이 끝나면 "더 이상 가져올 프레임이 없어요"를 출력하고 창이 없어진다. 동영상이 끝나지 않았는데 'q'를 누르면 "사용자 입력에 의해 종료합니다."를 출력하고 창이 없어진다.

카메라 출력

cap = cv2.VideoCapture(0) # 0번째 카메라 장치(Device ID)

if not cap.isOpened(): # 카메라가 잘 열리지 않은 경우
    exit() # 프로그램 종료
    
while True:
    ret, frame = cap.read()
    if not ret:
        break
    
    cv2.imshow('camera', frame)
    if cv2.waitKey(1) == ord('q'): # 사용자가 q를 입력하면
        break
        
cap.release()
cv2.destroyAllWindows()

3. 도형 그리기

빈 스케치북 만들기

import cv2
import numpy as np

# 세로 480 X 가로 640, 3 Channel(RGB)에 해당하는 스케치북 만들기
img = np.zeros((480, 640, 3), dtype = np.uint8)
#img[:] = (255, 255, 255) # 전체 공간을 흰 색으로 채우기
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

opencv는 BGR 순서이다.

sketch_book

일부 영역 색칠

import cv2
import numpy as np

img = np.zeros((480, 640, 3), dtype = np.uint8)
img[100:200, 200:300] = (255, 255, 255)
# [세로 영역, 가로 영역]

cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

저렇게 세로 영역과 가로 영역의 값을 변경해서 색을 칠할 수 있다.

coloring_area

직선

직선의 종류(line type)

  1. cv2.LINE_4 : 상하좌우 4 방향으로 연결된 선
  2. cv2.LINE_8 : 대각선을 포함한 8 방향으로 연결된 선(기본값)
  3. cv2.LINE_AA : 부드러운 선(anti-aliasing)
import cv2
import numpy as np

img = np.zeros((480, 640, 3), dtype = np.uint8)

COLOR = (0, 255, 255) # BGR : 노란색
THICKNESS = 3 # 두께

cv2.line(img, (50, 100), (400, 50), COLOR, THICKNESS, cv2.LINE_8) 
# (그릴 위치, 시작점, 끝점, 색깔, 두께, 선 종류)
cv2.line(img, (50, 200), (400, 150), COLOR, THICKNESS, cv2.LINE_4)
cv2.line(img, (50, 300), (400, 250), COLOR, THICKNESS, cv2.LINE_AA)

cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

draw_line

import cv2
import numpy as np

img = np.zeros((480, 640, 3), dtype = np.uint8)

COLOR = (255, 255, 0)
RADIUS = 50 # 반지름
THICKNESS = 10

cv2.circle(img, (200, 100), RADIUS, COLOR, THICKNESS, cv2.LINE_AA) # 속이 빈 원
# (그릴 위치, 원의 중심점, 반지름, 색깔, 두께, 선 종류)
cv2.circle(img, (400, 100), RADIUS, COLOR, cv2.FILLED, cv2.LINE_AA) # 속이 찬 원

cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

속이 차있는 원을 그릴 때는 두께를 cv2.FILLED로 바꿔주면 된다.

draw_circle