비디오를 저장하려면 먼저 몇 가지 필수 요소를 지정해야 합니다. 첫째, 저장할 파일의 위치와 이름을 정해야 합니다. 둘째, FourCC(Four Character Code, 4문자 코드)를 명시해야 합니다. FourCC는 데이터 형식을 식별하는 4바이트 문자 시퀀스로, 코덱 정보를 나타냅니다. 예를 들어 MP4 파일에는 'mp4v', AVI 파일에는 'MJPG' 같은 코드가 사용됩니다.
셋째, 비디오의 FPS(초당 프레임 수)를 선언해야 하고, 마지막으로 프레임 크기(가로·세로 해상도)도 지정해야 합니다. 이 네 가지 요소가 모두 갖춰져야 VideoWriter가 정상적으로 동작합니다.
아래 프로그램은 기본 카메라에서 실시간 비디오 스트림을 받아 지정한 경로에 MP4 형식으로 저장하는 예제입니다.
예제 코드
#include<opencv2/opencv.hpp>//VideoCapture 클래스와 VideoWriter 클래스를 사용하기 위한 OpenCV 헤더//
#include<iostream>
using namespace std;
using namespace cv;
int main() {
Mat myImage;//프레임을 저장할 행렬 선언//
VideoCapture cap(0);//기본 카메라에서 비디오를 캡처하기 위한 VideoCapture 객체 생성//
namedWindow("Video Player");//비디오를 표시할 창 선언//
if(!cap.isOpened()){ //비디오 스트림을 찾지 못하면 오류 메시지 출력//
cout << "Failed to access the camera" << endl;
system("pause");
return-1;
}
int frame_width = cap.get(CAP_PROP_FRAME_WIDTH);//프레임 너비 가져오기//
int frame_height = cap.get(CAP_PROP_FRAME_HEIGHT);//프레임 높이 가져오기//
VideoWriter video("video1.mp4",10,17,Size(frame_width, frame_height));//VideoWriter 객체 선언//
while (true){ //비디오를 계속 보여주기 위한 무한 루프//
cap >> myImage;
if (myImage.empty()){ //비디오 프레임이 감지되지 않으면 루프 종료//
break;
}
video.write(myImage);//프레임을 파일에 기록//
imshow("Video Player", myImage);//비디오 화면에 표시//
char c= (char)waitKey(25);
if(c==27){ //ESC 키(ASCII 27)를 누르면 종료//
break;
}
}
cap.release();//카메라 버퍼 메모리 해제//
video.release();
return 0;
}코드 설명
이 프로그램의 핵심 흐름은 다음과 같습니다.
1. 카메라 열기: VideoCapture 객체에 0을 전달하면 시스템의 기본 카메라에 연결됩니다. 카메라에 접근하지 못하면 오류 메시지를 출력하고 프로그램을 종료합니다.
2. 프레임 정보 가져오기: CAP_PROP_FRAME_WIDTH와 CAP_PROP_FRAME_HEIGHT 속성으로 카메라의 실제 해상도를 읽어옵니다. 이 값을 그대로 VideoWriter에 전달해 원본 화질을 유지합니다.
3. VideoWriter로 저장: 파일명('video1.mp4'), 코덱 관련 값, FPS, 프레임 크기를 인자로 전달하여 VideoWriter 객체를 생성합니다. while 루프 안에서 video.write() 함수가 매 프레임을 파일에 기록합니다.
4. 종료 처리: 사용자가 ESC 키(ASCII 코드 27)를 누르거나 더 이상 프레임이 들어오지 않으면 루프가 종료되고, release() 함수로 카메라와 파일 리소스를 모두 해제합니다.
이 프로그램을 실행하면 지정한 디렉터리에 정의된 이름과 형식(MP4)으로 비디오 파일이 저장됩니다. 만약 생성된 파일이 재생되지 않는다면, 사용 중인 OpenCV 빌드에 해당 코덱이 포함되어 있지 않은 경우이므로 'MJPG'처럼 다른 FourCC 코드나 '.avi' 확장자로 변경해 보는 것이 좋습니다.