[OpenCV] VideoWriter

스윗포테이토·2022년 11월 9일
1

VideoWriter 클래스를 통해 영상을 저장하는 방법에 대해 알아보려고 한다.

  1. 선언
cv::VideoWriter video_writer;
  1. 파일 열기
video_writer.open(file_path, fourcc, fps, Size, isColor);
  • file_path: 확장자 명 포함한 파일 경로
    ex) mp4, avi, mov...
  • fourcc: 코덱 정보를 나타내는 4문자 코드
    ex) 출처
  • fps: frame per second
    입력 영상에서 직접 구할 수도 있다.
    double fps = input_video.get(CAP_PROP_FPS);
    참고: 이전 포스트 - ?VideoCapture과 fps
  • Size: 영상 크기
    cv::Size(w, h);
  • isColor: 흑백이면 false, 컬러 영상이면 true

개인적으로 코덱을 설정하는데 애를 먹었다. 맥에서 기본으로 지원하지 않는 코덱도 있어서 이것 저것 시도한 후에 되는 것을 찾았다.

video_writer.open("../result1.mp4", //path
                  VideoWriter::fourcc('a', 'v', 'c', '1'), //fourcc
                  30, //fps
                  Size(2 * FRAME_WIDTH, 2 * FRAME_HEIGHT), //size
                  true //isColor
                  );
  1. 프레임 작성
video_writer << frame;
  1. 파일 닫기
video_writer.release();

예제 코드

#include "opencv2/opencv.hpp"

using namespace cv;

int main(){
	VideoCapture input_video("input_path");
    
    if (!input_video.isOpened()) {
        cout << "Can't open video\n";
        return;
    }
    
    int fourcc = VideoWriter::fourcc('a', 'v', 'c', '1');
    double fps = input_video.get(CAP_PROP_FPS);
    Size size = Size(input_video.get(CAP_PROP_FRAME_WIDTH), input_video.get(CAP_PROP_FRAME_HEIGHT));
    
    VideoWriter output_video;
    output_video.open("output_path", fourcc, fps, size, true);

    Mat frame, result;

    while (true) {
        video >> frame;

        if (frame.empty()) {
            break;
        }
        
        result = function(frame); // do something...
        
        output_video << result;
    }
    input_video.release();
    output_video.release();
}
profile
나의 삽질이 미래의 누군가를 구할 수 있다면...

0개의 댓글