본문 바로가기
컴퓨터 비전

OpenCV 주요 기능

by 태풍사랑 2020. 2. 14.

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

댓글