C++ 대신에 Python을 사용하여 비디오를 다뤄보자
이전 글을 통해 Microsoft Window 운영체제에 설치된 Visual Studio에 OpenCV를 활용할 수 있는 환경을 구성하고, C++ 을 이용하여 USB 카메라로 부터의 읽어온 영상을 디스플레이하고, 한장의 이미지를 저장하거나 영상을 녹화하는 프로그램을 작성해 보았다. (참고글)
이번 글을 통해서는 C++ 대신에 Python을 이용하여 동일한 기능을 갖는 간단한 프로그램을 작성해 본다.
비디오 디스플레이, 이미지 저장, 비디오 녹화를 수행하는 간단한 프로그램
import cv2 cap = cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) bRec = False while True: ch = cv2.waitKey(33) ret, frame = cap.read() cv2.imshow('VideoFrame', frame) if ch == ord('s'): # s 버튼이 눌리면 cv2.imwrite('image.jpg', frame) if ch == ord('r'): # r 버튼이 눌리면 if not bRec: outputVideo = cv2.VideoWriter('Video.avi', cv2.VideoWriter_fourcc(*'DIVX'), 30.0, (1280, 720)) bRec = True else: outputVideo.release() if bRec: outputVideo.write(frame) if ch == ord('q'): # q 버튼이 눌리면 break cap.release() cv2.destroyAllWindows()
알아 두어야 할 라인에 대한 간략한 설명
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
비디오 캡처 객체인 cap을 생성하고, 가로폭과 세로폭을 1280 x 720 으로 지정한다.
while True:
ch = cv2.waitKey(33)
종료 명령 ‘q’를 입력받기 전까지는 33ms 동안 키보드 입력을 기다린다.
만약, 키보드가 입력되면 그 키에 대한 ASCII 값을 ch 변수에 저장한다.
ret, frame = cap.read()
cv2.imshow('VideoFrame', frame)
USB 카메라로 부터 영상 프레임을 비디오 캡처 객체인 cap을 통해 읽고, 그 이미지를 디스플레이 한다.
if ch == ord('s'): # s 버튼이 눌리면
cv2.imwrite('image.jpg', frame)
키보드의 ‘s’ 버튼이 눌리면, 현재의 영상 프레임 한장을 ‘image.jpg’라는 이름으로 저장한다.
if ch == ord('r'): # r 버튼이 눌리면
if not bRec:
outputVideo = cv2.VideoWriter('Video.avi',
cv2.VideoWriter_fourcc(*'DIVX'),
30.0, (1280, 720))
bRec = True
else:
outputVideo.release()
if bRec:
outputVideo.write(frame)
키보드의 ‘r’ 버튼이 눌리고, bRec가 초기값인 False를 유지한 상태라면 VideoWriter 객체인 outputVideo를 생성한다.
outputVideo의 속성은 아래와 같다.
- ‘Video.avi’라는 이름으로 비디오 파일 생성
- 비디오 파일은 Divx로 압축
- 1초당 30장(Frame)의 이미지
- 비디오 사이즈는 1280 x 720
bRec의 값을 True로 변경하여, 다음번에 키보드 ‘s’가 눌리는 경우에는 VideoWriter 객체인 outputVideo 인스턴스를 해제 (outputVideo.release()) 한다.
또한, bRec의 값이 True인 경우라면, 읽어온 영상 프레임을 outputVideo 인스턴스에 저장한다. (outputVideo.write(frame))
if ch == ord('q'): # q 버튼이 눌리면
break
cap.release()
cv2.destroyAllWindows()
키보드 ‘q’ 버튼이 눌리면, VideoCapture 객체인 인스턴스인 cap을 해제하고, 프로그램을 종료한다.