VideoWriter
VideoWriter 생성자는 OpenCV에서 비디오 파일을 생성하고 프레임을 기록할 때 사용하는 객체다.
객체 정의는 다음과 같다.
VideoWriter(const String& filename, int fourcc, double fps, Size frameSize, bool isColor=true)
filename은 비디오를 저장할 파일 이름이다. 예를 들어 "output.avi"처럼 파일 경로와 이름을 지정한다.
어디에 저장될지, 어떤 이름으로 저장될지를 결정하는 거다.
fourcc는 비디오 코덱을 나타내는 4글자 코드다. 예를 들어, MJPG, XVID 같은 값들이 있다.
코덱이란, 비디오 프레임을 어떻게 압축해서 저장할지를 결정하는 방식이다. 코덱에 따라 비디오 품질과 파일 크기가 달라진다.
VideoWriter::fourcc('M', 'J', 'P', 'G')처럼 4개의 문자로 지정한다.
fps는 우리가 잘 알다시피 프레임레이트다. 초당 몇 개의 프레임을 기록할지 설정하는 값이다.
frameSize는 우리가 흔히 아는 비디오의 프레임 크기다. Size(width, height) 형식으로 지정해야하고 만약 Size(640, 480)면 640x480 크기의 비디오를 생성한다는 뜻이다.
isColor (기본값: true)는 이 값이 true 이면 컬러 비디오를 기록하고, false 이면 흑백(그레이스케일) 비디오를 기록한다.
다음은 간단한 코드 사용 예다
VideoWriter writer("output.avi", VideoWriter::fourcc('M', 'J', 'P', 'G'), 30, Size(640, 480), true);
그리고 다음은 실전 사용 예다.
int main() {
// 1. 웹캠을 통해 영상 캡처 준비 (장치 0: 기본 웹캠)
VideoCapture cap(0);
// 2. 웹캠이 제대로 열렸는지 확인
if(!cap.isOpened()) {
cout << "Error opening video stream" << endl;
return -1;
}
// 3. 웹캠의 기본 해상도를 가져옴 (캡처할 프레임의 가로, 세로 크기)
int frame_width = cap.get(cv::CAP_PROP_FRAME_WIDTH);
int frame_height = cap.get(cv::CAP_PROP_FRAME_HEIGHT);
// 4. 비디오 파일을 기록할 VideoWriter 객체 생성 (출력 파일: outcpp.avi)
VideoWriter video("outcpp.avi", cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), 10, Size(frame_width, frame_height));
// 5. 영상 캡처 및 기록을 위한 루프
while(1) {
Mat frame;
// 6. 웹캠에서 한 프레임씩 읽어옴
cap >> frame;
// 7. 프레임이 비어있으면 루프를 종료
if (frame.empty())
break;
// 8. 읽어온 프레임을 비디오 파일에 기록
video.write(frame);
// 9. 읽어온 프레임을 화면에 출력
imshow("Frame", frame);
// 10. ESC 키를 누르면 루프를 종료
char c = (char)waitKey(1);
if (c == 27) // 27은 ESC 키의 ASCII 코드
break;
}
// 11. 비디오 및 캡처 장치를 해제하고 모든 창을 닫음
cap.release();
video.release();
destroyAllWindows();
return 0;
}