DevelopmentTool/OpenCV

[OpenCV] VideoCapture 클래스

유제필 2022. 11. 17. 09:06

VideoCapture 클래스란?

카메라 또는 동영상 파일로부터 정지 영상 프레임을 받아올 수 있는 클래스이다.

동영상이란 일련의 정지 영상을 압축하여 파일로 저장한 형태로,

이때 동영상에 저장되어 있는 일련의 정지 영상을 프레임(frame) 이라고 한다.

그러므로 동영상을 처리하는 작업은 동영상에서 프레임을 추출한 후,

각각의 프레임에 영상 처리 기법을 적용하는 형태로 이루어진다.

컴퓨터에 연결된 카메라 장치를 사용하는 작업도 카메라로부터 일정 시간 간격으로 정지 영상 프레임을

받아와서 처리하는 형태이다.

 

class VideoCapture
{
public:
     VideoCapture();
     VideoCapture(const String& filename, int apiPreference = CAP_ANY);
     VideoCapture(int 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 isOpend() const;
     virtual void release();

     virtual bool grab();
     virtual bool retrieve(OutputArray image, int flag = 0);

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

     virtual bool set(int proID, double Value);
     virtual double get(int proID) const;
     ...
};

 

VideoCapure 클래스의 멤버 변수는 모두 Protected: 로 선언되어 있어 사용자가 직접 접근할 수 없다.

VideoCapture 클래스를 이용해 동영상 파일을 불러오거나, 프레임을 받아오는 등

VideoCapture 클래스의 멤버 함수가 여러 가지가 있다.

VideoCapture 클래스에서 동영상 파일을 불러오려면, 처음 VideoCapture 객체를 생성할 때

생성자에 동영상 파일 이름을 지정하거나 또는 기본 생성자로 VideoCapture 객체를 생성한 후,

open() 멤버 함수를 호출해야 한다.

 

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

filename : 동영상 파일 이름
apiPerference : 사용할 비디오 캡쳐 API 백엔드
반환값 : (VideoCapture::open() 함수) 열기가 성공하면 true, 실패하면 false

 

filename 인자에는 *.avi, *mpg, *.mp4 등 동영상 확장자를 갖는 파일 이름을 전달한다.

현재 프로그램 실행 폴더에 동영상 파일이 있으면 "test.mp4" 의 형태로 파일 이름만 지정하면 되지만,

다른 폴더에 동영상 파일이 있는 경우 절대 경로 또는 상대 경로를 추가하여 파일 이름을 지정한다.

 

"C:\\"test.mp4" // C 드라이브 최상위 폴더 절대 경로 지정

 

apiPerference 인자에는 동영상 파일을 불러오는 방법을 지정할 수 있다.

apiPreference 인자에는 VideoCaptureAPIs 열거형 상수 중 하나를 지정할 수 있다.

VideoCaptureAPIs 열거형 상수(주요)

VideoCaptureAPIs 열거형 상수
설명
CAP_ANY
자동 선택
CAP_V4L, CAP_V4L2
V4L / V4L2 (리눅스)
CAP_FIREWIRE, CAP_FIREWARE, CAP_IEEE1394
IEEE 1394 드라이버
CAP_DSHOW
다이렉트쇼(DirectShow)
CAP_PVAPI
PvAPI, Prosilica GigE SDK
CAP_OPENNI
OpenNI
CAP_MSMF
마이크로소프트 미디어 파운데이션
CAP_GSTSTREAMER
GStreamer
CAP_FFMPEG
FFMPEG 라이브러리
CAP_IMAGES
OpenCV에서 지원하는 일련의 영상 파일
CAP_OPENCV_MJPEG
OpenCV에 내장된 MotionJPEG 코덱

VideoCapture::open();

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

index : 카메라와 장치 사용 방식 지정 번호
apiPreference : 사용할 카메라 캡쳐 API 백엔드
반환값 : (VideoCapture::open() 함수) 열기가 성공하면 true, 실패하면 false 반환

 

VideoCapture::open() 멤버 함수를 이용해서 컴퓨터에 연결된 카메라 장치를 열 수 있다.

함수의 인자에는 문자열이 아닌 정수 값을 전달한다.

 

index = camera_id + domain_offset_id

 

VideoCapture::open() 함수에 전달하는 정수 index 값은 위와 같은 형태로 구성된다.

만약 컴퓨터에 1대의 카메라만 연결되어 있으면 camera_id 의 값은 0이다.

2대 이상의 카메라가 연결되어 있으면 각각의 카메라는 0보다 같거나 큰 정수를 ID로 갖는다.

domain_offset_id는 카메라 장치를 사용하는 방식을 표현하는 정수 값이며,

VideoCaptureAPIs 열거형 상수 중 하나를 지정할 수 있다.

대부분의 경우 CAP_ANY(자동 선택)을 사용하기 때문에 index값은 결국 camera_id와 같은 값으로 설정된다.

즉, 컴퓨터에 연결된 기본 카메라를 사용하려면 index 값을 0으로 설정하고,

2대의 카메라가 연결되어 있다면 0 또는 1을 지정한다.

VideoCapture::isOpened()

bool VideoCapture::isOpened() const;

반환값 : 카메라 또는 동영상 파일이 사용 가능하면 true, 불가능하면 false 반환

카메라 또는 동영상 열기 작업이 성공했는지 확인하는 함수이다.

카메라 또는 동영상 파일 열기를 수행한 후, VideoCapture::isOpened() 멤버 함수를 이용해 열기 작업을 성공했는지 확인하는 것이 좋다.

VideoCapture::release();

virtual void VideoCapture::release();

카메라 장치 또는 동영상 파일이 사용하던 자원을 해제하는 함수이다.

카메라 장치 또는 동영상 파일의 사용이 끝나면 사용하던 자원을 해제해야 한다.

VideoCapture::read();

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

image : 다음 비디오 프레임. 만약 더 가져올 프레임이 없다면 비어 있는 행렬로 설정됨
반환값 : 프레임을 받아올 수 없으면 false 반환

카메라 또는 동영상 파일로부터 다음 프레임을 받아와 Mat 클래스 형식의 변수에 저장하는 함수이다.

카메라 또는 동영상 파일로부터 한 프레임의 정지 영상을 받아오기 위해서

VideoCapture 클래스를 이용하여 카메라 또는 동영상 파일을 열고, 그 후 공통 멤버 함수를 사용해 프레임을 받아올 수 있다.

한 프레임을 받아오기 위해 VideoCapture::operator >>() 연산자 재정의 함수 또는 VideoCapture::read() 함수를 사용한다.

VideoCapture::get();

double VideoCapture::get(int proId) const;

proId : 속성 ID이다. VideoCaptureProperties 열거형 상수 중 하나를 지정할 수 있다.
반환값 : 지적한 속성 값이 반환된다. 만약 지정한 속성 값을 얻을 수 없으면 0을 반환한다.

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

정보는 VideoCaptureProperties 열거형 상수 중 원하는 값으로 지정한다.

VideoCaptureProperties 열거형 상수(주요)

VideoCaptureProperties 열거형 상수
설명
CAP_PROP_POS_MSEC
비디오 파일에서 현재 위치 (밀리초 단위)
CAP_PROP_POS_FRAMES
현재 프레임 위치(0-기반0
CAP_PROP_POS_AVI_RATIO
[0, 1] 구간으로 표현한 동영상 프레임의 상대적 위치 (0 : 시작, 1 : 끝)
CAP_PROP_FRAME_WIDTH
비디오 프레임의 가로 크기
CAP_PROP_FRAME_HEIGHT
비디오 프레임의 세로 크기
CAP_PROP_FPS
초당 프레임 수 (FPS : Frame Per Second)
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
(카메라에서 지원하는 경우) 초점 조절
VideoCapture cap(0);

int w = cvRound(cap.get(CAP_PROP_FRAME_WIDTH));
itn h = cvRound(Cap.get(CAP_PROP_FRAME_HEIGHT));

시스템 기본 카메라를 열고, 카메라의 기본 프레임 크기를 확인하는 코드이다.

VideoCapture::get()함수는 카메라 또는 동영상 파일 속성을 double 자료형으로 반환한다.

 

그래서 실제 코드에서는 정수형 변수에 프레임 크기를 저장하려면 정수형으로 변환하는 것이 좋다.

그래서 사용한 cvRound() 함수는 OpenCV에서 제공하는 반올림 함수이다.

VideoCapture::set()

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

proID : 속성 ID이다. VideoCaptureProperties 열거형 중 하나를 지정할 수 있다.
value : 지정할 속성 값
반환값 : 속성 지정이 가능하면 true, 불가능하면 false

VideoCapture::get() 함수의 반대로, 현재 열려 있는 카메라 또는 비디오 파일 재생과 관련된 속성 값을 설정하는 함수이다.

'DevelopmentTool > OpenCV' 카테고리의 다른 글

[OpenCV] 직선 그리기  (0) 2022.11.17
[OpenCV] VideoWriter 클래스  (0) 2022.11.17
[OpenCV] InputArray, OutputArray 클래스  (0) 2022.11.17
[OpenCV] Scalar 클래스  (0) 2022.11.17
[OpenCV] Vec 클래스  (0) 2022.11.17