1. 카메라 & 동영상 파일 다루기
① VideoCapture 클래스
- 하나의 클래스를 이용해 카메라 또는 동영상 파일로부터 정지 영상 프레임을 받아올 수 있음
- 모든 멤버 변수는 protected 모드로 선언 -> 사용자가 직접 접근 불가
- apiPreference 인자에는 동영상 파일을 불러오는 방법 지정
VideoCapture::VideoCapture(const String& filename, int apiPreference = CAP_ANY);
bool VideoCpature::open(const String& filename, int apiPreference = CAP_ANY);
//filename = 동영상 파일 이름, apiPreference = 사용할 비디오 캡쳐 API 백엔드
//반환값 = 열기 성공시 true, 실패시 false
bool VideoCapture::isOpend() const; //카메라 or 동영상 파일이 사용 가능하면 true
virtual void VideoCapture::release(); //객체 소멸 시 자동으로 열려 있던 카메라 장치나 동영상 파일이 닫힘
//카메라 or 동영상 파일로부터 한 프레임의 정지 영상을 받아 오는 방법
VideoCapture& VideoCapture::operator >> (Mat& image);
bool VideoCapture::read(OurputArray image); //imgae = 다음 비디오 프레임, 반환값 = 프레임을 받아올 수 없다면 false
//카메라 장치 또는 동영상 파일로부터 여러 가지 정보를 받아 오기 위한 함수
double VideoCapture::get(int propId) const; //propId = 속성 ID, 반환값 = 지정한 속성 값
//현재 열려 있는 카메라 또는 비디오 파일 재생과 관련된 속성 값 설정
bool VideoCapture::set(int propId, double value); //value = 지정할 속성 값, 반환값 = 속성 지정이 가능하면 true
② 카메라 입력 처리
③ 동영상 파일 처리
④ 동영상 파일 저장
- VideoWriter 클래스 사용
- fourcc = 동영상 파일의 코덱, 압축 방식, 색상 혹은 픽셀 포맷 등을 정의하는 정수 값
VideoWriter::VideoWriter(const String& filename, int fourcc, double fps,
Size frameSize, bool isColor = true);
bool VideoWriter::open(const String& filename, int fourcc, double fps,
Size frameSize, bool isColor = true);
//fourcc = 동영상 압축 코덱을 표현하는 4문자 코드, isColor = true이면 컬러 동영상 저장,false이면 그레이스케일 동영상 저장
//반환값 = 열기 성공 시 true, 실패 시 false
//fourcc에 해당하는 정수 값 생성
static int VideoWriter::fourcc(char c1, char c2, char c3, char c4); //코덱을 표현하는 1byte 문자 4개
//열려 있는 동영상 파일에 새로운 프레임 추가
VideoWriter& VideoWriter::operator << (const Mat& image);
void VideoWriter::write(InputArray image); //image = 추가할 프레임
//열려 있는 프레임을 닫는 함수
virtual void VideoWriter::realse();
2. 그리기 함수
① 직선 그리기
- line() 함수
- pt1 좌표부터 pt2 좌표까지 직선을 그림
- 인자 중 thinkness, lineType, shift 인자는 기본값이 지정되어 있음
void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,
int thickness = 1, int lineType = LINE_8, int shift = 0);
//shift = 그리기 좌표 값의 축소 비율
- arrowedLine() 함수 = 화살표 형태의 직성을 그리는 경우
void arrowedLine(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,
int thickness = 1, int line_type = 8, int shift = 0, double tipLength = 0.1);
//tipLength = 전체 직선 길이에 대한 화살표 길이의 비율
- drawMarker() 함수 = 다양한 모양의 마커를 그리는 함수
void drawMarker(InputOutputArray img, Point position, const Scalar& color,
int markerType = MARKER_CROSS, int markerSize=20, int thickness=1,
int line_type=8);
//position = 마커 출력 위치
② 도형 그리기
- rectangle() = 영상에 사각형을 그리는 함수
void rectangel(InputOutArray img, Point pt1, Point pt2, const Scalar& color,
int thickness=1, int lineType=LINE_8, int shift=0);
//rec = 사각형 위치 정보(Rect 객체)
- circle() = 원을 그리는 함수, 중심점 좌표와 반지름 지정
void circle(InputOutputArray img, Point center, int radius, cons Scalar& color,
int thickness=1, int lineType=LINE_8, int shift=0);
- ellipse() = 타원을 그리는 함수
void ellipse(InputOutputArray img, Point center, Size axes, double angel, double startAngle, double endAngle, const Scalar& color,
int thickness=1, int lineType=LINE_8, int shift=0);
//axes = 타원의 반지름
- polylines() = 다각형을 그리는 함수
void polylines(InputOutputArray img, InputArrayOfArrays pts, bool isClosed, const Scalar& color,
int thickness=1, int lineType=LINE_8, int shift=0);
//pts = 다각형 외곽 점들의 좌표 배열, 주로 vector<Point> 타입
③ 문자열 출력
- putText() = 영상 위에 정해진 폰트로 문자열을 출력하는 함수
void putText(InputOutputArray img, const String& text, Point org, int fontFace,
double fontScale, Scalar color, int thickness = 1, int lineType = LINE_8,
bool bottomLeftOrigin = false);
//org = 영상에서 문자열을 출력할 위치의 좌측 하단 좌표, fontFace = 폰트 종류
//bottomLeftOrigin = 이 값이 true이면 영상의 좌측 하단을 원점으로 간주
- getTextSize() = 문자열 출력을 위해 필요한 사각형 영역 크기를 가늠할 수 있는 함수
Size getTextSize(const String& text, int fontFace, double fontScale, int thickness, int* baseLine);
//baseLine = 출력 가장 하단의 텍스트 위치를 기준으로 하는 기준선의 y 좌표
//반환값 = 지정한 문자열 출력 시 차지하는 사각형 크기
3. 이벤트 처리
① 키보드 이벤트 처리
- waitKey() = 키 입력을 확인하기 위해 사용하는 함수
int waitKey(int delay = 0);
//delay = 키 입력을 기다릴 시간, 0보다 작거나 같으면 무한히 기다림
//반환값 = 눌려진 키 값(아스키 코드)
② 마우스 이벤트 처리
- setMouseCallback() = 특정 창에 마우스 콜백 함수를 등록하는 함수
void setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata = 0);
//winname = 마우스 이벤트 처리를 할 창의 이름
//onMouse = 마우스 이벤트 처리를 위한 콜백 함수 이름
//userdata = 콜백 함수에 전달할 사용자 데이터의 포인터
③ 트랙바
- 프로그램 동작 중 사용자 입력을 받을 수 있는 GUI를 추가하고 싶을 때 사용
- 영상 출력 창에 부착되어 프로그램 동작 중에 사용자가 지정된 범위 안의 값 선택 가능
- createTrackbar() = 트랙바 생성 함수
int createTrackbar(const String& trackbarname, const String& winnaem, int* value,
int count, TrackbarCallback onChange=0, void* userdata=0);
//value = 트랙바 위치를 받을 정수형 변수의 주소
//count = 트랙바 최대 위치
//onChange = 트랙바 위치가 변경될 때마다 호출되게 만들 콜백 함수 이름
//userdata = 트랙바 콜백 함수에 전달할 사용자 데이터의 포인터
- getTrackbarPos() = 트랙바의 현재 위치를 알아내는 함수
- setTrackbarPos() = 트랙바 위치를 강제로 특정 위치로 옮기는 함수
int getTrackbarPos(const String& trackbarname, const String& winname);
void setTrackbarPos(const String& trackbarname, const String& winname, int pos);
//pos = 트랙바를 이동할 위치
4. 데이터 파일 입출력
① FileStorage 클래스
- 데이터 파일 입출력을 담당
- openCV에서 사용하는 데이터의 파일 입출력 기능을 캡슐화하여 지원하는 클래스
- FileStorage::open() = 실제 사용할 파일을 열어주는 함수, XML/YAML/JSON 형식의 파일 입출력 지원
virtual bool FileStorage::open(const String& filename, int flags,
const String& encoding = String());
//flags = 파일 열기 모드, 반환값 = 파일을 열면 true
- FileStorage::isOpened() = 파일이 정상적으로 열렸는지 확인하는 함수
virtual bool FileStorage::isOpened() const;
//반환값 = 파일이 정상적으로 열려있으면 true
- FileStorage::release() = 사용하고 있던 파일을 닫고 메모리 버퍼를 해제하는 함수
virtual void FileStorage::release();
② 데이터 파일 저장
- C/C++ 자료형, STL 클래스, OpenCV 클래스 형식의 데이터를 JSON 파일 형식으로 저장
- FileStorage 객체에 데이터 이름을 먼저 저장 후, 실제 저장할 데이터를 저장
- 다양한 형식의 데이터 파일로 생성되며 저장된 파일은 FileStorage 클래스를 이용하여 다시 읽어 올 수 있음
③ 데이터 파일 불러오기
- FileStorage::operator[]() = 특정 이름으로 저장되어 있는 FileNode 객체에 접근하기 위한 연산자 재정의 함수
- cf) 노드 = 이름과 값으로 구성되어 있는 하나의 데이터
FileNode FileStorage::operator[](const char* nodename) const;
//반환값 = FileNode 객체
- 재정의된 >> 연산자 함수를 사용하여 데이터를 읽어 오려면 >> 연산자 왼쪽에 FileNode 객체 이름을 쓰고, >> 연산자 오른쪽에는 받아 올 데이터 형식에 맞는 변수 이름을 적음
5. 마스크 연산
- 임의의 모양을 갖는 ROI 설정을 위하여 일부 행렬 연산 함수에 대해 마스크 연산 지원
- 마스크 영상이 주어질 경우, 마스크 영상의 픽셀 값이 0이 아닌 좌표에 대해서만 연산이 수행
- Mat::setTo() = 행렬의 픽셀 값을 설정하는 함수
Mat& Mat::setTo(InputArray value, InputArray mask = noArray());
//value = 행렬 원소에 설정할 값
//mask = 마스크 행렬. 마스크 행렬의 원소가 0이 아닌 위치에서만 value 값이 설정
//반환값 = Mat 객체의 참조
- Mat::copyTo() = 행렬 복사 함수
void Mat::copyTo(OutputArray m, InputArray mask) const;
//m = 복사본이 저장될 행렬
6. 연산 시간 측정
- 실시간 연산을 필요로 하는 시스템 -> 각 단계의 연산 시간을 제대로 측정하여 분석하는 작업이 중요!
- getTickCount() = 특정 연산의 수행 시간을 측정
int getTickCount(void) //반환값 = 시스템 현재 틱 획수 (틱 = 매우 빠르게 증가하는 성능 측정 계수)
- 틱 횟수 차이 값은 컴퓨터 시스템 성능에 따라 다르게 측정됨 => 실제 연산 시간을 알아내기 위해 틱 횟수 차이를 시스템 틱 주파수로 나누는 작업 동반!
- getTickFrequency() = 틱 주파수를 구함(틱 주파수 = 1초 동안 발생하는 틱 횟수)
double getTickFrequency(void) //반환값 = 시스템의 초당 틱 횟수
6. 기타 유용한 함수
① sum(), mean()
- sum() = 원소 합을 구하고 싶을 때 사용
- maen() = 평균을 구하고 싶을 때 사용
Scalar sum(InputArray src);
Scalar mean(InputArray src, InputArray mask = noArray());
② minMaxLoc()
- 행렬 또는 영상에서 최솟값, 최댓값, 최솟값과 최댓값 위치를 찾을 때 사용
- 마스크 연산 지원 -> 행렬 일부 영역에서의 최솟값, 최댓값 또는 해당 위치를 구할 수 있음
- 행렬에서 가장 큰 원소 값만 알고싶은 경우 -> maxVal 인자만 설정
void minMaxLoc(InputArray src, double* minVal, double* maxVal = 0,
Point* minLoc = 0, Point* maxLoc = 0, InputArray mask = noArray());
③ normalize()
- 행렬의 노름 값 정규화 or 원소 값 범위를 특정 범위로 정규화
void normalize(InputArray src, InputOutputArray dst, double alpha = 1,
double beta = 0, int norm_type = NORM_L2, int dtype = -1,
InputArray mask = noArray());
//alpha = (노름 정규화인 경우)목표 노름 값, (원소 값 범위 정규화인 경우)최솟값
//beta = (원소 값 범위 정규화인 경우)최댓값
④ cvRound()
- 실수 값의 반올림 연산
int cvRound(double value);
int cvRound(float value);
'컴퓨터 비전' 카테고리의 다른 글
영상의 산술 및 논리 연산 (0) | 2020.02.25 |
---|---|
OpenCV 주요 클래스 (0) | 2020.02.12 |
openCV를 사용한 영상의 밝기와 명암비 조절 (1) | 2020.02.09 |
댓글