다양한 영상(이미지) / 동영상 처리에 사용되는 오픈소스 라이브러리
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() # 모든 창 닫기
- cv2.IMREAD_COLOR : 컬러 이미지, 투명 영역은 무시(기본값)
- cv2.IMREAD_GRAYSCALE : 흑백 이미지
- 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()
이미지의 height, width, channel 정보
img = cv2.imread('img.jpg')
img.shape # 세로, 가로, Channel
**수행결과**
(427, 640, 3)
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()
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 순서이다.
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()
저렇게 세로 영역과 가로 영역의 값을 변경해서 색을 칠할 수 있다.
직선의 종류(line type)
- cv2.LINE_4 : 상하좌우 4 방향으로 연결된 선
- cv2.LINE_8 : 대각선을 포함한 8 방향으로 연결된 선(기본값)
- 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()
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로 바꿔주면 된다.