OpenCV

[OpenCV_01_09_영상 녹화하기]

선호하는 2022. 12. 10. 21:10
import cv2

cap = cv2.VideoCapture(0)    # 0번 카메라 연결
if cap.isOpened:
    file_path = './record.avi'    # 저장할 파일 경로 이름 ---①
    fps = 30.0                     # FPS, 초당 프레임 수
    fourcc = cv2.VideoWriter_fourcc(*'DIVX') # 인코딩 포맷 문자
    width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
    height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
    size = (int(width), int(height))                        # 프레임 크기
    out = cv2.VideoWriter(file_path, fourcc, fps, size) # VideoWriter 객체 생성
    while True:
        ret, frame = cap.read()
        if ret:
            cv2.imshow('camera-recording',frame)
            out.write(frame)                        # 파일 저장
            if cv2.waitKey(int(1000/fps)) != -1: 
                break
        else:
            print("no frame!")
            break
    out.release()                                   # 파일 닫기
else:
    print("can't open camera!")
cap.release()
cv2.destroyAllWindows()

<코드 읽기>

VideoCapture 객체 생성

제대로 생성되었는지 확인 후 객체의 프레임의 크기를 불러 저장한다.

VideoWriter 객체를 저장할 파일명, 인코더, fps, 크기를 설정하면서 선언해준다.

VideoCapture 객체를 재생하면서 읽어오는 프레임 하나씩을 VideoWriter 에 저장해준다.

 

<new!>

cv2.VideoWriter_fourcc(c1, c2, c3, c4) - 입력받은 글자들을 4자리 코드로 연결해 반환, 위 코드에서는 " * "를 통해 한번에 입력받았다.

FourCC 개념에 대해서 먼저 알고 있어야 이해를 할 수 있는 코드이다.

FourCC는 주로 AVI파일의 영상 코덱을 구분할 때 쓰인다고 한다.

DIVX, XVID, MJPG 등이 사용 가능했다.

참조: https://ko.wikipedia.org/wiki/FourCC

 

cv2.VideoWriter(filename, fourcc, fps, frameSize) - 영상 쓰기 객체

filename - 저장될 파일 명

fourcc - 코덱 정의자

fps - 프레임 속도

frameSize - 프레임 크기

 

<사담>

코드를 실행해 보니 프레임 속도가 살짝 다른 듯 했다.

이 간극을 어떻게 처리해야 할 지 고민해 봐야 할 듯.

불러올 영상의 fps로 지정하는 건 방법이 아닌 듯 하다.