영상 다루기

Goal

  • 동영상을 읽고, 보여주고, 저장할 수 있다.

  • 관련 함수인 cv2.VideoCapure() , cv2.VideoWriter() 에 대해서 알 수 있다.

Camera로 부터 영상 재생

Camera로부터 영상을 읽어, 화면에 보옂기 위해서 아래와 같은 순서로 진행을 합니다.

  • VideoCapture Object를 생성합니다. 변수로는 camera device index나 동영상 파일명을 넘겨줍니다. 일반적으로 0 이면 Camera와 연결이 됩니다.

  • Loop를 돌면서 frame을 읽어 들입니다.

  • 읽은 frame에 대해서 변환작업을 수행한 후, 화면에 보여줍니다.

  • 영상 재생이 끝나면, VideoCapure Object를 release하고 window를 닫습니다.

아래 예제는 동영상을 읽어 grayscale로 변환 후 재생하는 예제입니다.

Sample Code

 1# -*-coding: utf-8 -*-
 2import cv2
 3
 4# cap 이 정상적으로 open이 되었는지 확인하기 위해서 cap.isOpen() 으로 확인가능
 5cap = cv2.VideoCapture(0)
 6
 7# cap.get(prodId)/cap.set(propId, value)을 통해서 속성 변경이 가능.
 8# 3은 width, 4는 heigh
 9
10print 'width: {0}, height: {1}'.format(cap.get(3),cap.get(4))
11cap.set(3,320)
12cap.set(4,240)
13
14while(True):
15    # ret : frame capture결과(boolean)
16    # frame : Capture한 frame
17    ret, frame = cap.read()
18
19    if (ret):
20        # image를 Grayscale로 Convert함.
21        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
22
23        cv2.imshow('frame', gray)
24        if cv2.waitKey(1) & 0xFF == ord('q'):
25            break
26
27cap.release()
28cv2.destroyAllWindows()

File로 부터 영상 재생

File로 부터 동영상 재생도 Camera에서 영상 재생과 동일합니다.

Sample Code

 1import cv2
 2
 3cap = cv2.VideoCapture('vtest.avi')
 4
 5while(cap.isOpened()):
 6    ret, frame = cap.read()
 7    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
 8    cv2.imshow('frame',gray)
 9
10    if cv2.waitKey(1) & 0xFF == ord('q'):
11        break
12cap.release()
13cv2.destroyAllWindows()

Note

동영상 재생시에는 해당 동영상의 Codec이 설치되어 있어야 합니다.

영상 저장

영상을 저장하기 위해서는 cv2.VideoWriter Object를 생성해야 합니다.

cv2.VideoWriter(outputFile, fourcc, frame, size)

영상을 저장하기 위한 Object

Parameters
  • outputFile (str) – 저장될 파일명

  • fourcc – Codec정보. cv2.VideoWriter_fourcc()

  • frame (float) – 초당 저장될 frame

  • size (list) – 저장될 사이즈(ex; 640, 480)

fourcc정보는 cv2.VideoWriter_fourcc('M','J','P','G') 또는 cv2.VideoWriter_fourcc(*'MJPG) 와 같이 표현할 수 있습니다. 각 OS마다 지원하는 codec 다릅니다.(Windows는 DIVX)

Sample Code

 1# -*-coding: utf-8 -*-
 2
 3import cv2
 4
 5cap = cv2.VideoCapture(0)
 6
 7fourcc = cv2.VideoWriter_fourcc(*'DIVX')
 8out = cv2.ViewoWriter('output.avi', fourcc, 25.0, (640,480))
 9
10while (cap.isOpend()):
11    ret, frame = cap.read()
12
13    if ret:
14        # 이미지 반전,  0:상하, 1 : 좌우
15        frame = cv2.flip(frame, 0)
16
17        out.write(frame)
18
19        cv2.imshow('frame', frame)
20
21        if cv2.waitKey(0) & 0xFF == ord('q'):
22            break
23    else:
24        break
25
26cap.release()
27out.release()
28cv2.destroyAllWindows()