영상 다루기

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
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# -*-coding: utf-8 -*-
import cv2

# cap 이 정상적으로 open이 되었는지 확인하기 위해서 cap.isOpen() 으로 확인가능
cap = cv2.VideoCapture(0)

# cap.get(prodId)/cap.set(propId, value)을 통해서 속성 변경이 가능.
# 3은 width, 4는 heigh

print 'width: {0}, height: {1}'.format(cap.get(3),cap.get(4))
cap.set(3,320)
cap.set(4,240)

while(True):
    # ret : frame capture결과(boolean)
    # frame : Capture한 frame
    ret, frame = cap.read()

    if (ret):
        # image를 Grayscale로 Convert함.
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        cv2.imshow('frame', gray)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

cap.release()
cv2.destroyAllWindows()

File로 부터 영상 재생

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

Sample Code

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import cv2

cap = cv2.VideoCapture('vtest.avi')

while(cap.isOpened()):
    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()

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
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# -*-coding: utf-8 -*-

import cv2

cap = cv2.VideoCapture(0)

fourcc = cv2.VideoWriter_fourcc(*'DIVX')
out = cv2.ViewoWriter('output.avi', fourcc, 25.0, (640,480))

while (cap.isOpend()):
    ret, frame = cap.read()

    if ret:
        # 이미지 반전,  0:상하, 1 : 좌우
        frame = cv2.flip(frame, 0)

        out.write(frame)

        cv2.imshow('frame', frame)

        if cv2.waitKey(0) & 0xFF == ord('q'):
            break
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()