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 |
---|