Attention please

[OpenCV] OpenCV를 이용한 동영상 출력 및 저장 본문

OpenCV

[OpenCV] OpenCV를 이용한 동영상 출력 및 저장

Seongmin.C 2023. 1. 8. 19:42

설명하기에 앞서 동영상은 여러 장의 사진들이 빠르게 넘어가는 것이라는 것을 알아두어야 한다.

 

다음 영상은 작업 path에 다운받아놓은 "cat_video.mp4" 파일의 영상이다. 

 

 

 

 

동영상 파일 출력

위에서 말했던 것처럼 동영상은 여러 장의 사진들이 합쳐져있는 것이다. 즉, 출력할 때 역시 각 frame들을 반복적으로 출력하는 방식으로 진행된다.

 

import cv2

cap = cv2.VideoCapture('cat_video.mp4')

while cap.isOpened():   # 동영상 파일이 올바로 올렸는가?
    ret, frame = cap.read()  # ret : 성공여부, frame : 받아온 이미지(프레임)
    if not ret:
        break
    
    cv2.imshow('video', frame)
    
    # 사용자가 입력한 key값이 q일때 이미지 출력을 종료한다.
    # cv2.waitKey(숫자) : 숫자의 값이 커지면 커질수록 영상 재생속도도 느려진다. 프레임이 넘겨지는 시간이 늘어나기 때문
    if cv2.waitKey(1) == ord('q'): # ord함수 : 파라미터 문자의 아스키코드를 반환함 => q의 아스키 코드를 반환
        break
        
        
cap.release()  # 자원 해제
cv2.destroyAllWindows()  # 모든 창 닫기

 

 

 

 

 

 

 

카메라 출력

이번에는 실제 컴퓨터에 있는 카메라로 출력되는 영상을 실시간으로 출력한다.

 

import cv2

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()

 

 

 

 

 

 

 

동영상 저장

이번에는 위의 영상을 다시 저장한다. 

 

영상을 저장하기에 앞서 codec을 우선 설정해준다.

 

# 코덱 정의
fourcc = cv2.VideoWriter_fourcc(*'DIVX')   # 'D', 'I', 'V', 'X' == *'DIVX'

 

opencv로 설정할 수 있는 코덱의 종류는 다음과 같이 존재한다.

 

 

다음으로 frame의 크기와 FPS를 설정한다.

 

# 프레임 크기, FPS
width = round(cap.get(cv2.CAP_PROP_FRAME_WIDTH)/2) # 정수여야 하기때문에 round를 사용
height = round(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS*2)

 

이제 저장을 위해 out 이라는 변수에 위에서 해주었던 설정들을 받아 저장한다.

 

out = cv2.VideoWriter('output.avi', fourcc, fps, (width, height))
# 저장 파일명, 코덱, FPS, 크기(width, height)

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    
    out.write(frame)  # 영상 데이터만 저장 (소리 X)
    cv2.imshow('video', frame)
    if cv2.waitKey(1) == ord('q'):
        break
        

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

 

Comments