프로그래밍/Python

[Python] OpenCV를 활용한 카메라 영상 저장 - 1

채윤아빠 2022. 1. 8. 14:36
728x90
반응형

Python에서 OpenCV를 활용하여 카메라 영상을 파일로 저장하는 방법에 대하여 알아 보겠습니다.

먼저 전체 예제 코드는 다음과 같습니다.

import cv2
import time

CAMERA_ID = 0
FRAME_WIDTH = 640
FRAME_HEIGTH = 480

capture = cv2.VideoCapture(CAMERA_ID)
if capture.isOpened() == False: # 카메라 정상상태 확인
    print(f'Can\'t open the Camera({CAMERA_ID})')
    exit()

capture.set(cv2.CAP_PROP_FRAME_WIDTH, FRAME_WIDTH)
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, FRAME_HEIGTH)

# Define the codec and create VideoWriter object. The output is stored in 'output.mp4' file.
out = cv2.VideoWriter('output.mp4', cv2.VideoWriter_fourcc(*'XVID'), 30, (FRAME_WIDTH, FRAME_HEIGTH))

prev_time = 0
total_frames = 0
start_time = time.time()
while cv2.waitKey(1) < 0:
    curr_time = time.time()

    ret, frame = capture.read()
    total_frames = total_frames + 1

    # Write the frame into the file (VideoWriter)
    out.write(frame)

    term = curr_time - prev_time
    fps = 1 / term
    prev_time = curr_time
    fps_string = f'term = {term:.3f},  FPS = {fps:.2f}'
    print(fps_string)

    cv2.putText(frame, fps_string, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 255))
    cv2.imshow("VideoFrame", frame)

end_time = time.time()
fps = total_frames / (start_time - end_time)
print(f'total_frames = {total_frames},  avg FPS = {fps:.2f}')

out.release()
capture.release()
cv2.destroyAllWindows()

위 코드를 실행하면, "VideoFrame" 창에 카메라 영상이 표시되면서 동시에 "output.mp4" 파일로 화면에 표시되는 영상이 저장됩니다.


이전 글과 겹치는 부분은 제외하고, 영상을 파일로 저장하기 위하여 새로 추가된 부분을 하나씩 분석해 보겠습니다.

out = cv2.VideoWriter('output.mp4', cv2.VideoWriter_fourcc(*'XVID'), 30, (FRAME_WIDTH, FRAME_HEIGTH))

영상 프레임을 파일로 저장하기 위해서는 VideoWriter 객체를 생성해야만 합니다.
VideoWriter 생성자의 파라미터는 다음과 같습니다. (그 외 몇가지가 더 있지만, 주로 사용하는 생성자는 아래 함수입니다.)

VideoWriter (const String &filename, int fourcc, double fps, Size frameSize, bool isColor=true)

각 파라미터의 의미는 다음과 같습니다.

  • filename : 영상 프레임이 저장될 파일명 (문자열)
  • fourcc : 영상 코덱 번호. VariationalRefinement_create() 함수 이용
  • fps : FPS 실수값
  • frameSize : 영상의 폭과 높이 튜플
  • isColor : 컬러 영상 여부

fourcc 코덱 번호 값을 구하기 위하여 VariationalRefinement_create() 함수를 이용합니다.
코덱 문자열로 사용할 수 있는 값들은 'DIVX', 'MJPG', 'XVID', 'H264' 등등입니다.

예제에서는 영상을 'XVID' 형식으로 저장하도록 지정하였습니다. FPS는 30으로 설정하였으나, 실수값으로 지정할 수 있습니다.

    out.write(frame)

카메라로부터 가져온 영상 프레임을 파일로 기록합니다.

out.release()

사용을 마친 VideoWriter 객체를 반환합니다.

이전 글 : https://hbesthee.tistory.com/1973

 

[Python] OpenCV를 활용한 카메라 영상 출력 - 2(FPS 표시)

Python에서 OpenCV를 활용하여 카메라 영상을 출력할 때, FPS(Frame per second) 정보를 함께 출력하는 방법에 대하여 알아 보겠습니다. 먼저 전체 예제 코드는 다음과 같습니다. import cv2 import time CAMERA_I..

hbesthee.tistory.com

 

다음에는 카메라로부터 가져온 영상을 파일로 저장할 때, 멀티 스레드로 파일 저장을 별도의 스레드에서 처리하는 방법에 대하여 알아보도록 하겠습니다.

참고자료