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
int main(int ac, char** av) {

	Mat img = imread("Lenna.png");

	imshow("img", img);
	waitKey(0);

	return 0;
}

 


1. imread()  : 이미지 불러오기

원형 : Mat cv::imread( const String& filename, int flags = IMREAD_COLOR)

 

filename 

불러오고자 하는 이미지의 경로 입력

불러오고자 하는 이미지가 프로젝트 폴더 안에 있다면 파일이름(확장자까지) 입력

 

flags

image read type 설정

< flag 종류 >

IMREAD_COLOR  : 3채널, 이미지파일을 컬러(BGR)로 로드하며 투명한 부분은 모두 무시. default값

IMREAD_GRAYSCALE  : 1채널, 이미지파일을 흑백으로 로드한다.

IMREAD_UNCHANGED  : 이미지파일을 알파채널을 포함하여 원본 그대로 로드한다. 

IMREAD_LOAD_GDAL : 이미지파일을 GDAL 드라이버를 활용하여 로드한다. (GDAL : 지도관련 이미지 처리)

IMREAD_ANYDEPTH : 정밀도를 16/32비트 또는 6비트로 로드한다.

IMREAD_ANYCOLOR : 가능한 3채널, 색상 이미지로 로드

IMREAD_REDUCED_GRAYSCALE_2 : 1채널, 1/2크기, 흑백 로드 

IMREAD_REDUCED_GRAYSCALE_4 : 1채널, 1/4크기, 흑백 로드

IMREAD_REDUCED_GRAYSCALE_8 : 1채널, 1/8크기, 흑백 로드

IMREAD_REDUCED_COLOR_2 : 3채널, 1/2크기, 컬러 로드 

IMREAD_REDUCED_COLOR_4 : 3채널, 1/4크기, 컬러 로드 

IMREAD_REDUCED_COLOR_8 : 3채널, 1/8크기, 컬러 로드 

 

2. imshow()  : 이미지 보여주기

원형 : void cv::imshow(const String& winname, InputArray mat);

 

winname

출력할 대상의 창 이름

 

mat

출력할 이미지 데이터(Mat 객체)

 

3. waitKey()  : 키 입력 대기

원형 : int cv::waitKey(int delay = 0);

 

delay

키 입력을 기다릴 시간(ms / ex : 3초 = 3000ms)

 

반환 값

눌려진 키 값. 지정한 시간동안 키가 눌려지지 않았을 경우 -1 return 

 

* waitKey() 사용하지 않을 경우, 윈도우 창이 유지 되지 않고 프로그램 종료됨.

 

- enter키를 누를 때만 종료하고 싶다면,  enter의 아스키코드 값인 13을 설정해주면 된다.

	while (true)
	{
		if (waitKey() == 13) break;
	}

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

[OpenCV C++] VideoCapture  (0) 2022.02.18

+ Recent posts