이 글에서는 OpenCV 라이브러리를 사용하여 동영상의 경과 시간(elapsed time)을 계산하는 방법을 알아보겠습니다. 동영상 재생 중 현재까지 지나간 시간을 실시간으로 확인하는 것은 영상 분석, 디버깅, 타임스탬프 기록 등 다양한 작업에 유용하게 활용됩니다.
아래 예제 프로그램은 C++과 OpenCV의 VideoCapture 클래스를 활용하여 동영상을 재생하면서 콘솔 창에 경과 시간을 출력합니다.
예제 코드
#include<opencv2/opencv.hpp>//OpenCV header to use VideoCapture class//
#include<iostream>
using namespace std;
using namespace cv;
int main() {
Mat myImage;//Declaring a matrix to load the frames//
namedWindow("Video Player");//Declaring the video to show the video//
VideoCapture cap("video.mp4");//Declaring an object to load video from device//
if (!cap.isOpened()){ //This section prompt an error message if no video stream is found//
cout << "No video stream detected" << endl;
system("pause");
return-1;
}
while (true){ //Taking an everlasting loop to show the video//
cap >> myImage;
int elapsed_time;//Declaring an integer variable to store the elapsed time//
elapsed_time=cap.get(CAP_PROP_POS_MSEC);//Reading the elapsed time//
cout << "Ellapsed time(in second):" << elapsed_time / 1000 << endl;//Showing the elapsed time in seconds//
if (myImage.empty()){ //Breaking the loop if no video frame is detected//
break;
}
imshow("Video Player", myImage);//Showing the video//
char c = (char)waitKey(25);//Allowing 25 milliseconds frame processing time and initiating break condition//
if (c == 27){ //If 'Esc' is entered break the loop//
break;
}
}
cap.release();//Releasing the buffer memory//
return 0;
}코드 설명
핵심 로직을 단계별로 살펴보면 다음과 같습니다.
1. 비디오 캡처 객체 생성
VideoCapture cap("video.mp4")를 통해 동영상 파일을 불러오는 객체를 생성합니다. 만약 비디오 스트림을 열지 못하면 isOpened() 함수가 false를 반환하고, 에러 메시지를 출력한 뒤 프로그램이 종료됩니다.
2. 경과 시간 읽기
가장 중요한 부분은 cap.get(CAP_PROP_POS_MSEC)입니다. 이 속성은 현재 재생 위치를 밀리초(millisecond) 단위로 반환합니다. 이 값을 정수형 변수 elapsed_time에 저장한 후, 1000으로 나누어 초 단위로 변환하여 콘솔에 출력합니다.
3. 프레임 표시 및 반복 처리
imshow()로 각 프레임을 화면에 보여주고, waitKey(25)를 통해 프레임당 25밀리초의 처리 시간을 부여합니다. 이때 사용자가 Esc 키(ASCII 코드 27)를 누르면 루프가 종료되며, 더 이상 읽어올 프레임이 없으면 myImage.empty() 조건에 의해 자동으로 반복문이 멈춥니다.
실행 결과
이 프로그램을 실행하면 동영상이 재생되는 동안 콘솔 창에 초 단위의 경과 시간이 실시간으로 출력됩니다.


참고 사항
CAP_PROP_POS_MSEC 외에도 VideoCapture::get() 메서드는 다양한 속성을 제공합니다. 예를 들어 CAP_PROP_POS_FRAMES(현재 프레임 인덱스), CAP_PROP_FPS(프레임률), CAP_PROP_FRAME_COUNT(전체 프레임 수) 등을 함께 활용하면 더욱 정밀한 시간 및 진행 상태 관리가 가능합니다.