OpenCV를 사용하여 카메라에서 영상을 입력받고, 이를 동영상으로 저장해보도록 하겠습니다. 입력 영상에서 일부 영역은 영상을 반전시켰습니다.
1) 코드 예제 및 실행 결과
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int main()
{
VideoCapture cap(0);
if (!cap.isOpened())
{
cerr << "Failed to open the camera" << endl;
return 1;
}
int w = cvRound(cap.get(CAP_PROP_FRAME_WIDTH));
int h = cvRound(cap.get(CAP_PROP_FRAME_HEIGHT));
double fps = 25;
cout << "Frame width, height: " << w << ", " << h << endl;
int fourcc = VideoWriter::fourcc('D', 'I', 'V', 'X');
int delay = cvRound(1000 / fps);
VideoWriter writer("output.avi", fourcc, fps, Size(w, h));
if (!writer.isOpened())
{
cerr << "Failed to open the file for writing" << endl;
cap.release();
return 1;
}
Mat frame, frame_inv;
while (true)
{
cap >> frame; // cap.read(frame)와 같은 동작 수행
if (frame.empty())
break;
// 영상 반전
frame_inv = frame(Rect(100, 100, 200, 200));
frame_inv = ~frame_inv;
// 영상 저장
writer << frame;
// 영상 출력
imshow("frame", frame);
// ESC 누르면 종료
if (waitKey(10) == 27)
break;
}
cap.release();
writer.release();
destroyAllWindows();
return 0;
}
카메라 문제로 실행이 안될 경우, 설정 > 카메라 개인 정보 설정에서 접근을 허용하시기 바랍니다.
그래도 실행이 안 된다면, 빌드를 Debug → Release 모드로 변경해 보시기 바랍니다.
실행 화면입니다.
왼쪽: 카메라 출력 / 오른쪽: 저장영상 재생
왼쪽: 카메라 출력 / 오른쪽: 저장영상 재생
2) 주요 함수
VideoCapture::VideoCapture(int index, int apiPreference = CAP_ANY)
컴퓨터에 연결된 카메라 장치를 사용하기 위해, VideoCapture 생성자에 index 정수 값을 전달합니다. index는 카메라 장치를 식별하기 위한 값으로 0부터 시작합니다. apiPreference는 사용할 카메라 캡처 API 백엔드를 의미하며, CAP_ANY을 사용하면 시스템에 맞는 API를 알아서 선택합니다.
* index 정수값 대신에 동영상 파일 경로를 전달하면, 카메라 입력이 아닌 동영상을 불러옵니다.
double VideoCapture::get(int propertyID)
카메라 장치 또는 동영상으로부터 속성값을 가져오는 함수입니다. propertyID를 지정하면, 속성값을 double형으로 반환합니다. CAP_PROP_POS_FRAMES (현재 프레임 위치), CAP_PROP_POS_MSEC (현재 재생중인 위치-밀리초 기준) 등의 property가 있으며, 전체 속성은 링크를 클릭하여 확인하시기 바랍니다.
static int VideoWriter::fourcc(char c1, char c2, char c3, char c4)
fourcc는 4글자 코드-four character code의 약자입니다. fourcc는 미디어 파일에 사용되는 비디오 코덱, 압축 형식, 색상 또는 픽셀 형식의 식별자입니다. 예로는 DIVX, XVID, FMP4, X264 등이 있으며, 다른 fourcc 코드를 확인하려면 링크를 클릭하시기 바랍니다.
static int VideoWriter::VideoWriter(String filename, int fourcc, double fps, Size frameSize, bool isColor)
VideoWriter 클래스는 동영상 파일을 쓰는 기능을 제공합니다. 생성자에서 파일을 열고, 4cc로 표현되는 동영상 압축 코덱, fps, frameSize, color 저장 여부를 셋팅합니다.
VideoCapture& VideoCapture::operator >> (Mat& image)
카메라 또는 동영상 파일에서 다음 frame을 받아옵니다.
VideoWriter& VideoWriter::operator << (const Mat& image)
frame을 출력 동영상에 추가합니다.