opencv c++ 동영상 파일 불러오기
- 최초 작성일: 2022년 1월 10일(월)
목차
[TOC]
목표
사진(정지), 동영상, 실시간 영상 등에 opencv를 사용할 수 잇다. 이번에는 실시간이 아닌 동영상 파일을 불러와보자.
실습
이번에는 실시간 웹캠이 아닌 영상처리를 위한 저장되어 있는 동영상 파일을 불러오는 것을 해보자. 똑같이 VideoCapture() 함수를 사용하지만, 이번엔 카메라 번호가 아닌 “sampleVideo.mp4” 와 같은 실제 동영상 파일명이 들어간다.
동영상이 다 끝나서 더이상 읽을 이미지가 없을 때에는 종료해주어야 하므로, img.empty() 일 때 종료하는 코드를 삽입해주어야 한다. 안 해주면 비디오가 끝났을 때, 더 이상 캡쳐할 이미지가 없다라는 에러가 뜬다.
waitKey(25)를 해주는 이유는 cap 매 순간순간의 이미지를 캡쳐해서 보여주는 방식인데, waitKey 함수 안에 들어가는 숫자는 delay를 얼마나 줄 것이냐를 결정하는 것이라고 생각하면 쉽다.
즉, waitKey(value)의 value를 작게두면, 동영상이 빨리 감기 한 것처럼 빠르게 재생이 된다. 그러므로, 적당한 value를 넣어주어야 한다.
마찬가지로 waitKey(25) == 27일 때, 즉 esc 눌렀을 시 video 재생을 중단하는 코드를 넣어준다.
소스 코드
// opencvEX.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include <opencv2/imgcodecs.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <stdio.h>
using namespace cv;
using namespace std;
int main(int ac, char** av) {
VideoCapture cap("sampleVideo.mp4");
// cap.set(CAP_PROP_POS_FRAMES, 100); // 100 번째 프레임으로 이동
if (!cap.isOpened()) { // isOpened() : 카메라 정보가 있는지 없는지 (1: 있다, 0: 없다)
cout << "Can't open the camera" << endl;
return -1;
}
Mat img;
while (true) {
cap >> img;
if (img.empty()) {
cout << "empty image" << endl;
return 0;
}
imshow("camera img", img);
if (waitKey(25) == 27) break;
}
return 0;
}
결과
실행시키면 아래와 같이 동영상이 실행되는 것을 확인할 수 있다.