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;
}



결과

실행시키면 아래와 같이 동영상이 실행되는 것을 확인할 수 있다.

image