VideoCapture 클래스

연결되어 있는 카메라 또는 동영상 파일로부터 정지 영상을 받아 올 수 있는 클래스

 

① 동영상 파일

원형 : VideoCapture::VideoCapture(const String& filename, int apiPreference = CAP_ANY);

 

filename

.avi, .mpg, .mp4등의 확장자를 갖는 동영상 파일의 경로

비디오 스트림 URL 지정가능(인터넷 동영상)

 

apiPreference 

동영상 파일을 불러오는 방법

 

< 종류 >

CAP_ANY : 자동 선택

CAP_V4L, CAP_V4L2 : V4L/V4L2(리눅스)

CAP_FIREWIRE, CAP_FIREWARE, CAP_IEEE1394 : IEEE1394 드라이버

CAP_DSHOW : 다이렉트 쇼

CAP_PVAPI : PvAPI, Prosilica GigE SDK

CAP_OPENNI : OpenNI

등등

 

② 카메라 장치

원형 : VideoCapture::VideoCapture(int index, int apiPreference = CAP_ANY);

 

index

카메라 ID

컴퓨터에 하나의 카메라만 연결되어 있다면 index = 0

컴퓨터에 두대 이상의 카메라가 연결되어 있다면 index는 0보다 같거나 큰 정수(두대 일 경우 0,1)

 

apiPreference 

동영상 파일을 불러오는 방법

 

< 종류 >

CAP_ANY : 자동 선택

CAP_V4L, CAP_V4L2 : V4L/V4L2(리눅스)

CAP_FIREWIRE, CAP_FIREWARE, CAP_IEEE1394 : IEEE1394 드라이버

CAP_DSHOW : 다이렉트 쇼

CAP_PVAPI : PvAPI, Prosilica GigE SDK

CAP_OPENNI : OpenNI

등등

③  isOpened()

원형 : virtual bool VideoCapture::isOpened() const;

연결된 카메라 or 동영상 열기 작업이 성공적으로 수행되었는지 확인

반환값 : 성공 시 true, 실패 시 false

 

release()

원형 : virtual void VideoCapture::release();

카메라 혹은 동영상 파일의 사용이 끝난 뒤 자원 해제

 

⑤ read(OutputArray image)

원형 : bool VideoCapture::read(OutputArray image);

= 원형 : VideoCapture& VideoCapture::operator >> (Mat& image);

카메라 또는 동영상 파일로부터 한 프레임의 정지 영상을 받아 옴

 

image

다음 비디오 프레임을 의미하며 프레임이 없다면 비어있는 행렬로 설정

반환값 : 프레임을 받아 올 수 없다면  false반환

 

grab() , retrieve()

원형 : VideoCapture::grab();

카메라 장치에 다음 프레임을 획득하라는 명령을 내리는 함수

 

원형 : VideoCapture::retrieve();

획득한 프레임을 실제로 받아오는 함수

 

* grab() + retrieve() = operator >>() or read()

 

get(int propId)

원형 : double VideoCapture::get(int propId) const;

열려 있는 카메라 or 동영상으로부터 정보를 받아오는 함수

 

반환 : 지정한 속성 값인 속성 값을 반환, 지정한 속성을 얻을 수 없으면 0 반환

 

예) 카메라의 프레임 크기를 확인하는 코드

	VideoCapture cap(0);

	// double자료형 반환 값을 cvRound()함수를 이용하여 반올림
	int w = cvRound(cap.get(CAP_PROP_FRAME_WIDTH));		
	int h = cvRound(cap.get(CAP_PROP_FRAME_HEIGHT));

propId

VideoCaptureProperties 열거형 중 하나를 지정

CAP_PROP_POS_MSEC  비디오 파일에서 현재 위치(밀리초 단위)
CAP_PROP_POS_FRAMES  현재 프레임 위치(0-기반)
CAP_PROP_POS_AVI_RATIO  [0, 1] 구간으로 표현한 동영상 프레임의 상대적 위치( 0 : 시작, 1 : 끝 )
CAP_PROP_FRAME_WIDTH  비디오 프레임의 가로 크기
CAP_PROP_FRAME_HEIGHT  비디오 프레임의 세로 크기
CAP_PROP_FPS  초당 프레임 수
CAP_PROP_FOURCC  fourcc 코드 ( 코덱을 표현하는 정수 값 )
CAP_PROP_FRAME_COUNT  비디오 파일의 전체 프레임 수
CAP_PROP_BRIGHTNESS  밝기 조절
CAP_PROP_CONTRAST  명암비 조절
CAP_PROP_SATURATION  채도 조절
CAP_PROP_HUE  색상 조절
CAP_PROP_GAIN  감도 조절
CAP_PROP_EXPOSURE  노출 조절
CAP_PROP_ZOOM  줌 조절
CAP_PROP_FOCUS  초점 조절

 

⑥ set(int propId, double value)

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

 

propId

VideoCaptureProperties 열거형 중 하나를 지정 (*위 표 참고)

 

value

지정할 속성 값

 

반환

가능 할 경우 true, 실패 할 경우 false 반환

 


[코드]

#include <opencv2/imgcodecs.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>

#include <iostream>
#include <stdio.h>

using namespace cv;
using namespace std;


int main(int ac, char** av) {
	
	VideoCapture cap(0);				// index = 0

	// double자료형 반환 값을 cvRound()함수를 이용하여 반올림
	cout << "Frame width: " << cvRound(cap.get(CAP_PROP_FRAME_WIDTH)) << endl;
	cout << "Frame height: " << cvRound(cap.get(CAP_PROP_FRAME_HEIGHT)) << endl;

	// 카메라 장치가 정상적으로 열렸는지 확인
	if (!cap.isOpened())				
	{
		printf("Can't open the camera");
		return -1;
	}

	Mat frame , inversed;

	while (true)
	{
    	// frame 변수에 하나의 정지된 프레임 저장
		cap.read(frame);

		// 카메라로부터 받아온 프레임이 없을 경우 종료
		if (frame.empty())
		{
			break;
		}

		inversed = ~frame;

		// 영상 출력
		imshow("camera LIVE", frame);
		imshow("camera LIVE2", inversed);

		// 1ms기다린 뒤 다음 프레임을 받아옴, Enter키 입력 시 종료
		if (waitKey(1) == 13)
		{
			break;
		}
	}

	destroyAllWindows();

	return 0;
}

[실행화면]

'Study > OpenCV C++' 카테고리의 다른 글

[OpenCV C++] imread(), imshow()  (0) 2022.02.18

+ Recent posts