현재 프레임(Current Frame)이란 동영상을 재생하는 도중 화면에 표시되고 있는 바로 그 순간의 프레임을 의미합니다. 흔히 '활성 프레임(Active Frame)'이라고도 부르며, 영상 처리 애플리케이션 개발 시 특정 지점의 프레임 번호를 파악해야 하는 경우가 자주 발생합니다.
OpenCV에서는 VideoCapture 클래스가 제공하는 get() 함수와 CAP_PROP_POS_FRAMES 속성을 사용하면 현재 프레임의 위치(번호)를 손쉽게 조회할 수 있습니다.
예제 코드
아래 프로그램은 video.mp4 파일을 재생하면서 매 프레임마다 현재 프레임의 위치를 읽어 콘솔 창에 출력합니다.
#include<opencv2/opencv.hpp> // VideoCapture 클래스를 사용하기 위한 OpenCV 헤더 //
#include<iostream>
using namespace std;
using namespace cv;
int main() {
Mat myImage; // 프레임을 담을 행렬 선언 //
namedWindow("Video Player"); // 영상을 출력할 윈도우 생성 //
VideoCapture cap("video.mp4"); // 영상 파일을 불러오는 객체 생성 //
if(!cap.isOpened()){ // 비디오 스트림을 찾지 못하면 에러 메시지 출력 후 종료 //
cout << "No video stream detected" << endl;
system("pause");
return-1;
}
while (true){ // 영상을 계속 재생하기 위한 무한 루프 //
cap >> myImage;
int current_Frame; // 현재 프레임 위치를 저장할 정수 변수 선언 //
current_Frame = cap.get(CAP_PROP_POS_FRAMES); // 현재 프레임의 위치 읽기 //
if (myImage.empty()){ // 더 이상 읽을 프레임이 없으면 루프 탈출 //
break;
}
cout << "Current Frame Number:" << current_Frame << endl;
imshow("Video Player", myImage); // 영상 화면에 출력 //
char c = (char)waitKey(25); // 25밀리초 대기하며 종료 조건 확인 //
if (c == 27){ // 'Esc' 키 입력 시 루프 탈출 //
break;
}
}
cap.release(); // 버퍼 메모리 해제 //
return 0;
}코드 핵심 포인트
cap.get(CAP_PROP_POS_FRAMES): VideoCapture 객체의 현재 프레임 인덱스를 반환합니다. 반환값은 1부터 시작하는 위치 값이며, double 타입으로 전달되므로 필요에 따라 정수형으로 변환해 사용하면 됩니다.
myImage.empty(): 모든 프레임을 다 읽었거나 영상 로드에 실패한 경우 true를 반환하므로, 이를 활용해 무한 루프를 안전하게 종료할 수 있습니다.
waitKey(25): 각 프레임 사이에 25밀리초의 지연 시간을 두어 영상이 너무 빠르게 재생되지 않도록 하며, 이때 입력받은 키 값이 27(Esc)이면 프로그램을 종료합니다.
실행 결과
프로그램을 실행하면 동영상이 재생되고, 콘솔 창에는 재생 상태에 따라 증가하는 현재 프레임 번호가 실시간으로 출력됩니다.

