프로젝트/OpenCV

영상처리 알고리즘 병렬화 - [OpenCV][C++]영상 읽기/출력/저장

윤깡패 2023. 6. 6. 18:49
OpenCV(Open Source Computer Vision Library) 

  : 실시간 컴퓨터 비전을 목적으로 한 라이브러리

 

https://opencv.org

 

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

  • 읽어 올 영상 파일을 실행 파일과 같은 폴더에 위치시킨다.

읽어 올 영상 파일 : vtest.avi

 

 

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

  • 읽어온 영상이 화면에 출력되는 동안 새로운 영상 파일이 생성된다.

화면에 출력되는 원본 영상

 

새로운 영상 파일 : save_origin_video.mov

 

- 읽어 온 영상이 종료되면 생성했던 윈도우가 제거된다.

- 영상이 재생되는 중간에 '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

 

 

728x90