OpenCV Mat 함수를 이용한 영상 불러오기_Visual Studio 2019_C++

1. 개요

Visual Studio 2019에서 C++로 OpenCV를 이용하여 동영상을 불러와 재생하는 예제입니다.

인코딩 된 동영상을 재생할 수 있을 뿐만 아니라, 웹캠이나 URL을 이용한 RTSP 영상도 재생 가능합니다.

 

본 포스팅의 작업 환경은 Windows 10Visual Studio 2019, OpenCV 4.3입니다.

**OpenCV 버전이나 기타 요인에 따라 예제 코드가 동작하지 않을 수 있습니다.

 

 

 

2. Mat 함수를 이용한 영상 불러오기 코드

복사 붙여 넣기를 통해 프로젝트에 넣어주면 됩니다.

/*********************************************************
				Heisanbug OpenCV Test
				2020.07.13
				Mat 함수를 이용한 동영상 불러오고 출력하기
				Alta software developer
**********************************************************/

//C++ header file 
#include <iostream>

//opencv header file include
#include "opencv2/highgui.hpp"
#include "opencv2/core.hpp"


#define VIDEO_PATH "vtest.avi"
#define WEBCAM_NUM 0
//https://www.wowza.com/html/mobile.html
#define RTSP_URL "rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov"

#define VIDEO_WINDOW_NAME "video"


//project main function
int main(int argc, char** argv) {

	//opencv videocapture class
	//동영상, 웹캠, RTSP 영상을 불러올 수 있다.
	cv::VideoCapture videoCapture(VIDEO_PATH);

	//영상을 불러오기 실패 시
	if (!videoCapture.isOpened()) {
		std::cout << "Can't open video !!!" << std::endl;
		return -1;
	}

	//OpenCV Mat class
	cv::Mat videoFrame;


	float videoFPS = videoCapture.get(cv::CAP_PROP_FPS);
	int videoWidth = videoCapture.get(cv::CAP_PROP_FRAME_WIDTH);
	int videoHeight = videoCapture.get(cv::CAP_PROP_FRAME_HEIGHT);

	std::cout << "Video Info" << std::endl;
	std::cout << "video FPS : " << videoFPS << std::endl;
	std::cout << "video width : " << videoWidth << std::endl;
	std::cout << "video height : " << videoHeight << std::endl;

	//이미지를 window를 생성하여 보여줍니다.
	cv::namedWindow(VIDEO_WINDOW_NAME);

	//video 재생 시작
	while (true) {
		//VideoCapture로 부터 프래임을 받아온다
		videoCapture >> videoFrame;

		//캡쳐 화면이 없는 경우는 Video의 끝인 경우
		if (videoFrame.empty()) {
			std::cout << "Video END" << std::endl;
		}

		cv::imshow(VIDEO_WINDOW_NAME, videoFrame);

		//'ESC'키를 누르면 종료된다.
		//FPS를 이용하여 영상 재생 속도를 조절하여준다.
		if (cv::waitKey(1000 / videoFPS) == 27) {
			std::cout << "Stop Video" << std::endl;
			break;
		}
	}


	//생성하였던 윈도우를 제거합니다.
	cv::destroyWindow(VIDEO_WINDOW_NAME);

	//아래의 함수를 사용하면, 사용하고 있던 윈도우 전부를 제거합니다.
	//cv::destroyAllWindows();

	return 0;
}

 

 

**Visual Studio에 OpenCV를 포팅하는 방법은 아래의 포스팅을 참고하세요.

https://heisanbug.tistory.com/21

 

Visual Studio 2019에 OpenCV 설치하기_Windows 10_OpenCV 4.3

1. 개요 Visual Studio 2019에서 C++ 언어 기반의 프로젝트에서 OpenCV 라이브러리를 이용하는 경우 OpenCV 라이브러리를 직접 다운로드하고 Path 설정을 해줘야 합니다. 처음 OpenCV를 설치하시는 분들을 위�

heisanbug.tistory.com

 

 

 

3. 프로젝트에서 영상 불러오기

이번 프로젝트에서 사용하는 영상은 vtest.avi 영상을 사용합니다.

 

영상은 설치한 OpenCV 디렉토리 내부에 존재하는 샘플 영상입니다.

C폴더에 OpenCV를 설치하였을 경우의 디렉터리 위치는 C:\opencv\sources\samples\data 입니다.

 

 

본 영상을 프로젝트가 위치한 폴더에 복사하여 넣어주면 됩니다.

 

 

 

4. cv::VideoCapture로 영상 읽어오기

	//opencv videocapture class
	//동영상, 웹캠, RTSP 영상을 불러올 수 있다.
	cv::VideoCapture videoCapture(VIDEO_PATH);

	//영상을 불러오기 실패 시
	if (!videoCapture.isOpened()) {
		std::cout << "Can't open video !!!" << std::endl;
		return -1;
	}

	//OpenCV Mat class
	cv::Mat videoFrame;


	float videoFPS = videoCapture.get(cv::CAP_PROP_FPS);
	int videoWidth = videoCapture.get(cv::CAP_PROP_FRAME_WIDTH);
	int videoHeight = videoCapture.get(cv::CAP_PROP_FRAME_HEIGHT);

	std::cout << "Video Info" << std::endl;
	std::cout << "video FPS : " << videoFPS << std::endl;
	std::cout << "video width : " << videoWidth << std::endl;
	std::cout << "video height : " << videoHeight << std::endl;

위의 코드 부분이 VideoCapture Class를 사용하여 영상을 읽어오는 부분입니다.

Class 생성자의 인자 부분에서 동영상을 불러오려면 비디오가 위치한 경로를 넣어주면 됩니다.

 

동영상이 아닌 웹캠이나 RTSP 영상을 불러오는 것도 가능합니다.

웹캠은 디바이스 id를 입력이 필요하며, 디바이스 id는 보통 0부터 부여됩니다.

RTSP 영상을 재생하기 위해선 URL 입력이 필요하며, 예제의 샘플 URL을 이용하여 테스트하시면 됩니다.

 

VideoCapture Class의 get 메서드를 이용하여 동영상의 fps와 size를 구할 수 있습니다.

*동영상의 fps는 이후 영상 재생 속도를 조절하는 데 사용됩니다. 

 

 

 

5. while 문을 이용한 동영상 재생

	//video 재생 시작
	while (true) {
		//VideoCapture로 부터 프래임을 받아온다
		videoCapture >> videoFrame;

		//캡쳐 화면이 없는 경우는 Video의 끝인 경우
		if (videoFrame.empty()) {
			std::cout << "Video END" << std::endl;
		}

		cv::imshow(VIDEO_WINDOW_NAME, videoFrame);

		//'ESC'키를 누르면 종료된다.
		//FPS를 이용하여 영상 재생 속도를 조절하여준다.
		if (cv::waitKey(1000 / videoFPS) == 27) {
			std::cout << "Stop Video" << std::endl;
			break;
		}
	}

위의 코드 부분은 동영상을 재생하는 부분입니다.

코드를 살펴보면, videoCapture로 부터 이미지를 Mat형식인 videoFrame이라는 변수에 저장하고

cv::imshow를 이용하여 Window에 출력하는 방식으로 영상이 재생됩니다.

 

위의 코드 부분에서 cv::waitKey 함수의 인자인 1000 / videoFPS 부분은 영상의 재생 속도를 제어하는 부분이며,

1000ms에서 FPS를 나누어준 값만큼의 ms시간 동안 대기 후 다음 이미지가 출력됩니다.

직관적인 이해가 어렵다면, cv::waitKey 함수의 인자를

임의의 값으로 변경시켜 테스트해보시면 이해가 더 빠를 것입니다.  

 

 

vtest.avi 영상 재생

예제 코드를 이용하여 출력한 영상의 캡처입니다.

보행자 감지 알고리즘 테스트에 많이 사용은 영상이라 익숙하신 분들도 많을 거라 생각합니다.

 

 

 

6. 기타

각자 개인이 갖고 있는 영상을 재생하여 테스트하는 것도 좋은 방법입니다.

또한 RTSP 영상 재생은 CCTV의 영상을 받아오는 방법 중 하나가 될 수 있습니다.

 

혹시 어려움을 겪고 있으시거나 문의사항이 있으시다면 댓글로 남겨주세요.

최대한 빠르게 답변하겠습니다.

 

 

 

X. 참고 사이트

https://docs.opencv.org/4.3.0/index.html

www.wowza.com/html/mobile.html

댓글

Designed by JB FACTORY