OpenCV4로 배우는 컴퓨터 비전과 머신러닝_4장_1

코넬·2022년 11월 14일
0

VideoCapture 클래스

프레임 : 동영상에 저장되어있는 일련의 정지 영상
카메라와 동영상 파일을 다루는 작업은 연속적인 프레임 영상을 받아와 처리한다는 공통점이 존재함.

OpenCV에서는 VideoCapture 클래스를 이용하여 카메라 또는 파일로부터 정지 영상 프레임을 받아올 수 있음.

class VideoCapture
{
public:
	VideoCapture();
	VideoCapture(const String& filename, int apiPrefernce = CAP_ANY);
	VideoCapture(index index, int apiPreference = CAP_ANY);
	virtual ~VideoCapture();

	virtual bool open(const String& filename, int apiPreference = CAP_ANY);
	virtual bool open(int index, int apiPreference = CAP_ANY);
	virtual bool isOpened() const;
	virtual voide release();

	virtual bool grab();
	virtual bool read(OutputArray image);

	virtual bool set(int propId, double value);
	virtual double get(int propId) const;
};

VideoCapture클래스에서 동영상 불러오기
처음 VC객체를 생성할 때 생성자에 동영상 파일 이름을 지정하거나 기본 생성자로 VC객체를 생성한 후 VC::open() 멤버 함수를 호출해야함.

VideoCapture::VideoCapture(const String& filename, int apiPreference = CAP_ANY);
bool VideoCapture::open(const String& filename, int apiPreference = CAP_ANY);

filename 확장자를 갖는 동영상 파일 이름을 전달
apiPreference 사용할 비디오 캡처 API 백엔드
반환값 VC::open()함수 열기가 성공하면 T, 실패하면 F

VideoCapture 클래스를 사용해 카메라 장치 사용하는 방법

VideoCapture::VideoCapture(int index, int apiPreference = CAP_ANY);
bool VideoCapture::open(int index, int apiPreference = CAP_ANY);

index 카메라 장치 사용 방식 지정 번호
apiPreference 사용할 카메라 캡처 API 백엔드
반환값 VC::open 함수 열기가 성공하면 T, 실패하면 F
index = camera_id + domain_offset_id

bool VideoCapture::isOpened() const;

반환값 카메라 또는 동영상 파일이 사용 가능하면 true, 그렇지 않으면 false

virtual void VideoCapture::release();

카메라 장치 또는 동영상 파일 사용이 끝나면 이 함수를 호출해 사용하던 자원을 해제해야함.
카메라 또는 동영상파일로부터 한 프레임의 정지영상 받아오기

VideoCapture& VideoCapture::operator >> (Mat& image);
bool VideoCapture::read(OutputArray image);

image 다음 비디오 프레임.만약 가져올 프레임이 없다면 비어있는 행렬로 설정
반환값 프레임 받아올 수 없으면 false 반환
>>연산자 카메라 혹은 동영상 파일로부터 다음 프레임을 받아와서 Mat 클래스 형식의 변수 image에 저장


get함수 현재 열려있는 카메라 장치 또는 동영상 파일로부터 여러가지 정보를 받아옴.

double VideoCapture::get(int propId) const;

propId 속성 ID. VideoCaptureProperties 열거형 중 하나를 지정함.
반환값 지정한 속성 값. 만약 지정한 속성을 얻을 수 없으면 0을 반환함.


set함수 카메라 또는 비디오 파일 재생과 관련된 속성값을 설정

bool VideoCapture::set(int propId, double value);

propId 속성ID. VideoCaptureProperties 열거형 중 하나를 지정함.
value 지정할 속성 값
반환값 속성 지정이 가능하면 true, 아니면 false


카메라 입력 처리하기

카메라로부터 일정 시간 간격마다 프레임을 받아 와서 화면에 출력하는 코드

Mat frame;
while (true) {
	cap >> frame;
    imshow("frame", frame);
    waitkey(10); //사용자의 키 입력을 기다림
}

while반복문을 무한으로 반복하며 매 프레임을 화면에 출력
waitkey()함수로 사용자의 키 입력을 무한히 기다림


동영상 파일 처리하기

대부분 동영상 파일 -> 코덱(codec)을 이용하여 압축된 형태로 저장
OpenCV -> 코덱 해석 기능을 제공하기 때문에 VideoCapture 클래스를 사용하여 동영상 파일을 쉽게 불러와 사용 가능
동영상 파일을 다룰 시 1. VideoCapture객체를 생성
2. VideoCapture::open()멤버 함수를 사용해 동영상 파일을 여는 작업 수행(문자열 형태로 받음)
3. 동영상 파일의 초당 프레임의 수 FPS(frames per second)값을 고려 - 이를 통해 프레임 사이의 시간 간격을 계산할 수 있음.


동영상 파일 저장하기

일련의 프레임을 동영상 파일로 저장하는 기능
VideoWriter클래스 OpenCV에서 동영상 파일을 생성하고 프레임을 저장
1. VideoWriter 클래스 객체를 생성
2. VideoWriter::open()멤버 함수를 이용하여 저장할 동영상 파일을 쓰기 모드로 열기

VideoWriter::VideoWriter(const String& filename, int fourcc, double fps, Size frameSize, bool isColor = true);
bool VideoWriter::open(const String& filename, int fourcc, double fps, Size frameSize, bool isColor = true);

filename 저장할 동영상 파일 이름
fourcc 동영상 압축 코덱을 표현하는 4-문자 코드
fps 저장할 동영상의 초당 프레임 수
frameSize 동영상 프레임의 가로 및 세로 크기
isColor 이 값이 true 이면 컬러 동영상으로 저장하고, false 이면 그레이스케일 동영상으로 저장한다. (window만 가능)
반환값 VideoWriter::open()함수 열기가 성공하면 T, 실패하면 F

static int VideoWriter::fourcc(char c1, char c2, char c3, char c4);

c1,c2,c3,c4 코덱을 표현하는 1byte 문자 네개
반환값 정수형 4-문자 코드

VideoWriter& VideoWriter::operator << (const Mat& image);
void VideoWriter::write(InputArray image);

image 추가할 프레임

virtual void VideoWriter::release();

프레임 저장 완료 후, 열려있던 파일을 닫는 위의 함수 호출

profile
어서오세요.

0개의 댓글