<2-2. Getting started with Videos>
Video를 읽고, 출력하고, 저장하는 것을 배워 볼 것 이다. 그리고 카메라로부터 캡쳐하고 출력하는 것도 배울 것이다.
cv2.VideoCapture(), cv2.Videowriter()에 대해서 알아 볼 것이다.
Capture Video from Camera
종종 카메라로 부터의 라이브 스트림을 캡쳐해야할 때가 있다. 이에 대해 OpenCV는 간단한 인터페이스를 제공한다. 노트북에 내장된 카메라를 통해 캡쳐해보고, grayscale로도 변환해보고 출력해보자!
먼저 VideoCapture 객체를 만들어야한다. device 번호나 파일의 이름이 될 수 있다. device index는 기기를 구분하기 위한 번호이다. 보통은 하나의 카메라가 연결될 것이다. 그러디 간단하게 0을 넘겨주자. 그러면 프레임별로 캡쳐할 수 있다. 마지막에는 캡쳐를 종료하는 것을 잊지 말자.
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
# 프레임별로 캡쳐한다
ret, frame = cap.read()
# 흑백으로 바꾼다
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 결과 프레임을 출력한다
cv2.imshow('frame', gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
#다 끝나면 캡쳐를 종료
cap.release()
cv2.destroyAllWindows()
cap.read()는 bool type을 출력한다(T/F). 프레임이 제대로 읽혔다면 True일 것이다. 이 결과값을 통해 비디오의 끝을 확인할 수 있다.
가끔 cap이 캡쳐를 초기화되지 않을 대가 있다. cap.isOpened()를 통해 초기화 여부를 알 수 있다. 사실이라면 OK, 그렇지 않으면 cap.open()을 사용하여 열어야 한다.
Playing Video from file
카메라 인덱스를 파일명으로 바꾸는 것만 다르고, 카메라로부터 캡쳐하는 것과 똑같다. 또한 프레임을 출력할 때, cv2.waitKey()에 대해 적절한 시간을 사용해라. 너무 작으면 비디오는 빨라지고, 너무 높으면 비디오가 느러진다. 보통의 경우 25가 적절하다.
import numpy as np
import cv2
cap = cv2.VideoCapture('intro.avi')
while(True):
ret, frame = cap.read()
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
영상은 유튜브 '차밍트립'의 인트로 영상을 불러들였다.
Saving a Video
비디오를 캡쳐했고, 이제는 저장하고 싶을 것이다. 이미지라면 매우 간단하게 cv2.imwrite()를 하지만 비디오는 조금의 노력이 더 필요하다.
VideoWriter라는 객체를 생성한다. 출력의 filename을 정해야한다. 그리고 파일 형태(FourCC)를 정해줘야한다. (avi,divx,mjpg) 그리고 fps 값과 프레임 사이즈를 정해야한다. 마지막으로 isColor flag를 사용한다. True라면 컬러 영상을, 아니라면 흑백 영상을 출력할 것이다.
만약에 MJPG라면 cv2.VideoWriter_fourcc(‘M’,’J’,’P’,’G’) 또는 cv2.VideoWriter_fourcc(*’MJPG’)로 입력한다.
아래의 코드는 카메라를 통해 매 프레임 마다 수직방향으로 뒤집고 저장한다.
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
# codec 을 정한다. (MOV)
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('output.mp4',fourcc,20.0,(640,480))
while(cap.isOpened()):
ret, frame = cap.read()
if ret == True:
frame = cv2.flip(frame,0)
# flipped frame을 저장
out.write(frame)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
out.release()
cv2.destroyAllWindows()
각 운영 체제에 맞는 FourCC를 정해주길 바란다.
jupyter notebook은 CV의 show부분들에서는 잘 맞지 않는 것 같다..