OpenCV(Open Source Computer Vision Library)
: 실시간 컴퓨터 비전을 목적으로 한 라이브러리
Home
OpenCV provides a real-time optimized Computer Vision library, tools, and hardware. It also supports model execution for Machine Learning (ML) and Artificial Intelligence (AI).
opencv.org
Goal
- 원본 영상 읽기
- 원본 영상을 화면에 출력
- 원본 영상을 파일에 저장
Content
- 읽어 올 영상 파일을 실행 파일과 같은 폴더에 위치시킨다.
Code
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(void)
{
VideoCapture open_origin_video("vtest.avi");
if(!open_origin_video.isOpened())
{
cerr << "ERROR! Unable to open the Origin Video\n";
open_origin_video.release();
return -1;
}
double fps = open_origin_video.get(CAP_PROP_FPS);
int width = open_origin_video.get(CAP_PROP_FRAME_WIDTH);
int height = open_origin_video.get(CAP_PROP_FRAME_HEIGHT);
int fourcc = VideoWriter::fourcc('m', 'p', '4', 'v');
VideoWriter save_origin_video("save_origin_video.mov", fourcc, fps, Size(width, height));
while(open_origin_video.isOpened())
{
Mat origin_frame;
open_origin_video >> origin_frame;
if(origin_frame.empty())
{
cerr << "ERROR! blank Origin Frame grabbed\n";
return 0;
}
// 원본 영상 출력, 저장
imshow("Origin Video", origin_frame);
save_origin_video << origin_frame;
if(waitKey(1000 / fps) == 'q')
{
break;
}
}
open_origin_video.release();
save_origin_video.release();
destroyAllWindows();
return 0;
}
Result
- 읽어온 영상이 화면에 출력되는 동안 새로운 영상 파일이 생성된다.
- 읽어 온 영상이 종료되면 생성했던 윈도우가 제거된다.
- 영상이 재생되는 중간에 'q' 키를 눌러 영상을 종료할 경우, 'q' 키를 누르기 전까지의 영상만 파일에 저장된다.
Function
- VideoCapture::VideoCapture(const String &filename, int apiPreference=CAP_ANY)
- filename : 읽어 올 영상 파일 이름
- apiPreference : 영상 파일을 불러오는 방법
- CAP_ANY : 자동 선택
VideoCapture open_origin_video("vtest.avi");
- "vtest.avi"의 프레임을 읽어온다.
- double VideoCapture::get(int propID)
인자로 지정한 속성 ID에 해당하는 속성값을 반환한다.
- propID : 속성값
- CAP_PROP_FPS : 초당 프레임 수
- CAP_PROP_FRAME_WIDTH : 영상 프레임의 가로 크기
- CAP_PROP_FRAME_HEIGHT : 영상 프레임의 세로 크기
double fps = open_origin_video.get(CAP_PROP_FPS);
int width = open_origin_video.get(CAP_PROP_FRAME_WIDTH);
int height = open_origin_video.get(CAP_PROP_FRAME_HEIGHT);
- 영상의 초당 프레임 수, 프레임의 가로 / 세로 크기를 받아온다.
- int VideoWriter::fourcc(char c1, char c2, char c3, char c4)
새로운 영상 파일의 코덱, 압축 방식, 색상 혹은 픽셀 포맷 등을 정의하는 정수 값을 생성한다.
int fourcc = VideoWriter::fourcc('m', 'p', '4', 'v');
- .mov 확장자로 저장하기 위해 인수로 'm', 'p', '4', 'v' 를 사용한다.
- VideoWriter::VideoWriter(const String &filename, int fourcc, double fps, Size frameSize, bool isColor=true)
- filename : 저장할 영상 파일 이름
- fourcc : 코덱 정보
- fps : 초당 프레임 수
- frameSize : 프레임 크기 (가로, 세로)
- isColor : 컬러 영상일 경우 true, 흑백 영상일 경우 false
VideoWriter save_origin_video("save_origin_video.mov", fourcc, fps, Size(width, height));
- 저장할 일련의 프레임은 모두 크기와 데이터 타입이 같아야 한다.
- VideoCapture & VideoCapture::operator >> (Mat &image)
영상의 프레임을 읽어 와 Mat 형태로 변환하여 저장한다.
- image : 프레임을 저장할 Mat 형태의 변수
Mat origin_frame;
open_origin_video >> origin_frame;
- Mat 구조체 : 각 픽셀 위치에 해당하는 BGR 값을 저장한다.
- open_origin_video의 프레임을 읽어 와 Mat 형태의 변수 origin_frame에 저장한다.
- void imshow(const String &winname, InputArray mat)
Mat 객체에 저장된 프레임을 화면에 출력한다.
- winname : 윈도우의 이름
- mat : 윈도우에 출력할 이미지
imshow("Origin Video", origin_frame);
- Mat 형태의 변수 origin_frame에 저장된 프레임을 "Origin Video" 윈도우에 출력한다.
- VideoWriter & VideoWriter::operator << (const Mat &image)
일련의 프레임을 영상 파일로 저장한다.
- image : 프레임을 읽어 올 Mat 형태의 변수
save_origin_video << origin_frame;
- origin_frame에 저장된 프레임을 save_origin_video 형태의 영상 파일로 저장한다.
- int waitKey(int delay=0)
지정한 시간만큼 사용자의 키보드 입력을 대기한다.
- delay : 밀리초 단위 대기 시간
if(waitKey(1000 / fps) == 'q')
{
break;
}
- delay ≤ 0일 경우 사용자의 키 입력을 무한히 기다리게 되기 때문에 보통 0보다 큰 정수를 입력해야 한다.
- 'q' 키를 눌러 종료한다.
- VideoCapture::release()
사용하던 리소스를 해제한다.
open_origin_video.release();
- void VideoWriter::release()
사용하던 리소스를 해제한다.
save_origin_video.release();
- void destroyAllWindows()
생성했던 윈도우를 전부 제거한다.
destroyAllWindows();
- 생성했던 "Origin Video" 윈도우를 제거한다.
GitHub
https://github.com/YunSoobin/ParallelProgramming
GitHub - YunSoobin/ParallelProgramming: 영상처리 알고리즘 병렬화
영상처리 알고리즘 병렬화. Contribute to YunSoobin/ParallelProgramming development by creating an account on GitHub.
github.com
'프로젝트 > OpenCV' 카테고리의 다른 글
영상처리 알고리즘 병렬화 - [OpenCV][C++]영상에 Median Filter(중간값 필터) 적용 (2) | 2023.06.13 |
---|---|
영상처리 알고리즘 병렬화 - [OpenCV][C++]영상에 Salt and Pepper Noise 추가 (2) | 2023.06.07 |