OpenCV VideoWriter를 이용한 영상 저장_C++
- Coding/OpenCV
- 2020. 7. 26.
1. 개요
OpenCV를 이용한다면 받아온 RTSP 영상이나 PC에 연결된 캠 영상을 동영상으로 저장 가능합니다.
간단하게 인코딩 형식을 정의할 수 있으며, 능력이 된다면 크롭이나 리사이징, 노이즈 제거와 같은
영상처리 가공 결과물을 영상으로 저장 가능합니다.
물론 동영상을 가공하거나 편집하는 기능을 갖고 있는 툴을 대용하기는 힘들겠지만,
잘 활용한다면 개발자만의 독특한 영상편집 기능을 구현할 수 있는 좋은 프로그램을 제작할 수도 있을 것입니다.
VidoWriter는 OpenCV에서 제공하는 영상 저장 기능을 담고 있는 클래스입니다.
OpenCV 컴파일 시 FFmpeg나 Gstreamer, V4l 라이브러리를 이용하는 것으로 보아
여러 가지 오픈소스를 이용하여 구현된 클래일 것으로 예상됩니다.
관심 있으신 분들은 깃허브에 있는 OpenCV 코드를 살펴보시면 됩니다.
이번 포스팅에서의 코드는 영상을 받아와 후처리 없이
VideoWriter를 이용하여 영상을 바로 저장하는 기능을 구현하였습니다.
**본 포스팅의 코드는 Windows 10 환경에서 Visual Studio 2019에서 OpenCV 4.3 버전을 이용하여 테스트되었습니다.
2. VideoWriter를 이용한 영상 저장 코드
복사 붙여 넣기를 이용하여 사용하시면 됩니다.
/*********************************************************
Heisanbug OpenCV Test
2020.07.26
VideoWriter를 이용한 동영상 저장하기
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 OUTPUT_VIDEO_NAME "out.avi"
#define VIDEO_WINDOW_NAME "video"
//project main function
int main(int argc, char** argv) {
//opencv videocapture class
//동영상, 웹캠, RTSP 영상을 불러올 수 있다.
cv::VideoCapture videoCapture(RTSP_URL);
cv::VideoWriter videoWriter;
//영상을 불러오기 실패 시
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;
//OpenCV VideoWriter setting
//codec info
//https://thebook.io/006939/ch04/01/04-02/
videoWriter.open(OUTPUT_VIDEO_NAME, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'),
videoFPS , cv::Size(videoWidth, videoHeight), true);
//영상 저장 셋팅 실패시
if (!videoWriter.isOpened())
{
std::cout << "Can't write video !!! check setting" << std::endl;
return -1;
}
//이미지를 window를 생성하여 보여줍니다.
cv::namedWindow(VIDEO_WINDOW_NAME);
//video 재생 시작
while (true) {
//VideoCapture로 부터 프래임을 받아온다
videoCapture >> videoFrame;
//캡쳐 화면이 없는 경우는 Video의 끝인 경우
if (videoFrame.empty()) {
std::cout << "Video END" << std::endl;
}
//받아온 Frame을 저장한다.
videoWriter << videoFrame;
//window에 frame 출력.
cv::imshow(VIDEO_WINDOW_NAME, videoFrame);
//'ESC'키를 누르면 종료된다.
//FPS를 이용하여 영상 재생 속도를 조절하여준다.
if (cv::waitKey(1000 / videoFPS) == 27) {
std::cout << "Stop video record" << std::endl;
break;
}
}
//생성하였던 윈도우를 제거합니다.
cv::destroyWindow(VIDEO_WINDOW_NAME);
return 0;
}
** Visual Studio에서 영상을 불러오는 코드를 이용하여 저장하는 기능까지 구현된 코드입니다.
https://heisanbug.tistory.com/23
3. cv::VideoWriter Class로 영상 저장하기
cv::VideoWriter videoWriter;
....
....
//OpenCV VideoWriter setting
//codec info
//https://thebook.io/006939/ch04/01/04-02/
videoWriter.open(OUTPUT_VIDEO_NAME, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'),
videoFPS , cv::Size(videoWidth, videoHeight), true);
//영상 저장 셋팅 실패시
if (!videoWriter.isOpened())
{
std::cout << "Can't write video !!! check setting" << std::endl;
return -1;
}
VideoWriter를 선언하는 부분입니다.
VideoWriter의 open 메서드를 이용해 저장할 video의 이름과 인코딩 형식, fps, video size, video color 여부까지 설정이 가능합니다.
이 부분에서 가장 헷갈리는 부분이 인코딩 형식입니다.
여러 가지 OpenCV에서 제공하는 여러가지 인코딩 형식이 존재하고,
그 형식을 cv::VideoWriter:fourcc를 이용하여 받아오게 됩니다.
인코딩 형식은 변경이 가능하며, 버전마다 지원하는 인코딩 형식이 조금씩 다릅니다.
본 포스팅에서 사용된 인코딩 형식은 MJPG 형식으로,
윈도우용으로 다운로드한 OpenCV 4.3.0 에서는 정상 동작합니다.
기타 인코딩 형식을 확인할 수 있는 사이트를 첨부합니다.
다른 인코딩 형식으로 테스트를 꼭 해보시고, 차이점을 알아보시면 됩니다.
https://thebook.io/006939/ch04/01/04-02/
//받아온 Frame을 저장한다.
videoWriter << videoFrame;
받아온 Frame을 저장하는 코드입니다.
이미지 한 장 한 장이 영상으로 저장되는 것을 확인할 수 있습니다.
4. 동영상 저장 결과 확인
성공적으로 프로그램을 실행시켰다면, 프로젝트 폴더에 out.avi 동영상이 저장된 것을 확인 가능합니다.
5. 기타
문의사항이 있으시다면 댓글로 남겨주세요!! 최대한 빠르게 답변하겠습니다.
X. 참고 사이트
https://thebook.io/006939/ch04/01/04-02/
https://docs.opencv.org/4.3.0/dd/d9e/classcv_1_1VideoWriter.html
'Coding > OpenCV' 카테고리의 다른 글
OpenCV Mat 함수를 이용한 영상 불러오기_Visual Studio 2019_C++ (11) | 2020.07.16 |
---|---|
OpenCV Mat 함수를 이용한 이미지 불러오기_Visual Studio 2019_C++ (4) | 2020.07.12 |
Visual Studio 2019에 OpenCV 설치하기_Windows 10_OpenCV 4.3 (30) | 2020.07.04 |