본문 바로가기
Computer Vision

OpenCV 주요 기능 - 1. 카메라와 동영상 파일 다루기(1)

by ksb0511 2020. 2. 13.

1. VideoCapture 클래스

  •  카메라 또는 동영상 파일로부터 정지 영상 프레임을 받아 올 수 있는 클래스
  • VideoCapture 클래스 멤버 변수는 모두 protected: 모드로 선언되어 있어 사용자가 직접 접근 불가능

// VideoCapture 클래스를 사용한 동영상 파일을 불러오는 기능
VideoCapture::VideoCapture(const String& filename, int apiPreference = CAP_ANY);
bool VideoCapture::open(const String& filename, int apiPreference = CAP_ANY);

 

  • filename 인자에 들어갈 수 있는 것
    • .avi, .mpg, .mp4 등의 확장자를 갖는 동영상 파일 이름
    • 하나의 동영상 파일 대신 일련의 숫자로 구분되는 이름의 정지 영상 파일을 차례대로 불러오고 싶을 경우
      • img0001.jpg, img0002.jpg, img0003.jpg 등의 이름으로 구성된 다수의 정지 영상 파일의 경우 filename 인자에 img%04d.jpg 라고 입력
    • "protocol://host:/port/script_name?script_params|auth" 형태의 비디오 스트림 URL 지정 가능(인터넷 동영상)
  • apiPreference 인자에는 동영상 파일을 불러오는 방법을 지정할 수 있음.
VideoCaptureAPIs 열거형 상수 설명
CAP_ANY 자동 선택
CAP_V4L, CAP_V4L2 V4L/V4L2(리눅스)
CAP_FIREWIRE, CAP_FIREWARE, CAP_IEEE1394 IEEE 1394 드라이버
CAP_DSHOW 다이렉트쇼
CAP_PVAPI PvAPI, Prosilica GigE SDK
CAP_OPENNI OpenNI
CAP_MSMF

마이크로소프트 미디어 파운데이션

(Microsoft Media Foundation)

CAP_GSTREAMER GStreamer
CAP_FFMPEG FFMPEG 라이브러리
CAP_IMAGES OpenCV에서 지원하는 일련의 영상 파일
CAP_OPENCV_MJPEG OpenCV에 내장된 MotionJPEG 코덱

// VideoCapture 클래스를 사용한 컴퓨터에 연결된 카메라 장치를 사용하는 방법
VideoCapture::VideoCapture(int index, int apiPreference = CAP_ANY);
bool VideoCapture::open(int index, int apiPreference = CAP_ANY);

 

  • index = camera_id + domain_offset_id
    • 컴퓨터에 하나의 카메라만 연결되어 있다면 camera_id = 0
    • 컴퓨터에 두대 이상의 카메라가 연결되어 있다면 camera_id 값은 0보다 같거나 큰 정수 (두 대일 경우 0 또는 1)
    • domain_offset_id는 카메라 장치를 사용하는 방식을 표현하는 정수값을 의미
    • 대부분 domain_offset_id는 자동 선택을 의미하는 0(CAP_ANY)을 사용하기 때문에 index 값은 camera_id와 같은 값으로 설정함.
  • apiPreference 값은 위의 표에 있는 VideoCaptureAPIs 열거형 상수 중 하나를 지정

virtual bool VideoCapture::isOpened() const; 				// 작업의 성공적인 수행을 확인하기 위한 용도

 

  • VideoCapture::isOpened() 멤버 함수를 이용하여 열기 작업이 성공적으로 수행되었는 지 확인 하는 멤버 함수
  • 반환값 : 카메라 or 동영상 파일 사용 가능 시 true, 그렇지 않을 시  false

virtual void VideoCapture::release();		// 카메라 혹은 동영상 파일의 사용이 끝난 뒤 자원 해제

 

  • VideoCapture 소멸자에도 release 함수와 마찬가지로 사용하고 있던 자원을 모두 해제하는 코드가 들어가 있어 객체가 소멸할 때 자동으로 열려 있던 카메라나 파일이 닫히게 됨.

// 카메라 또는 동영상 파일로부터 한 프레임의 정지 영상을 받아 오는 방법
VideoCapture& VideoCapture::operator >> (Mat& image);
bool VideoCapture::read(OutputArray image);

 

  • 정상적으로 카메라나 동영상 파일이 열렸다면 그 후에 공통의 멤버 함수를 사용하여 프레임을 받아 올 수 있음.
  • image 인자 : 다음 비디오 프레임을 의미하며, 만약 더 가져올 프레임이 없다면 비어 있는 행렬로 설정
  • 반환값은 프레임을 받아 올 수 없을 시 false 반환

* TIP

VideoCapture::grab();		// 카메라 장치에 다음 프레임을 획득하라는 명령을 내리는 함수
VideoCapture::retrieve();		// 획득한 프레임을 실제로 받아 오는 함수

 

  • grab() 과 retrieve() 함수를 합친 건 read() 또는 operator >>() 연산자 함수라고 볼 수 있음.
  • 컴퓨터에 여러 대의 카메라를 연결하고 여러 카메라로부터 동시에 영상을 획득하려고 할 때 grab과 retrieve 함수를 따로 호출하여 이용하면 좋음.
  • retrieve 함수는 grab 함수에 비해 수행 속도가 느림. -> 같은 시점의 사진을 획득하려면 여러 대의 카메라에 대해 차례대로 grab 함수를 호출한 뒤 다시 retrieve 함수를 호출하는 것이 좋음.

double VideoCapture::get(int propId) const;		// 열려 있는 카메라 혹은 동영상으로부터 정보를 받아 오는 함수

 

  • get() 함수는 지정한 속성 값인 속성 ID(propId) 값을 반환, 만약 지정한 속성을 얻을 수 없으면 0을 반환
  • 예 ) 기본 카메라를 열고, 그 카메라의 기본 프레임 크기를 확인하는 코드
    • get() 함수는 카메라 또는 동영상 속성을 double 자료형으로 반환
    • cvRound() 함수를 사용하여 반올림해줌.
VideoCapture cap(0);

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

 

  • propId 값은 VideoCaptureProperties 열거형 상수 중 하나를 지정할 수 있음.
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 초점 조절

// 현재 열려 있는 카메라 또는 비디오 재생과 관련된 속성 값 설정
bool VideoCapture::set(int propId, double value);

 

  • propId 값은 get과 마찬가지로 VideoCaptureProperties 열거형 중 하나를 지정
  • value 값은 지정할 속성 값을 의미
  • 속성 지정이 가능하면 true, 아닐 경우 false를 반환함.

댓글