Opencv
윈도우 창 띄우기
cv:imshow()
키보드로부터 키가 입력될 때 까지 계속해서 기다린다.
cv:waitKey(0);
1채널 uchar형 (CV_8UC1)
기본 템플릿 클래스
int 형, float 형, double 형
cv::Point3i
cv::Point3f
cv::Point3d
간결 선언 방식 사용 가능
Point_클래스
가로와 세로의 위치를 2차원 좌표로 나타내기 위한 템플릿 클래스
멤버변수 : 가로와 세로 위치를 나타내는 x, y.
Point_<int> pt(x, y)
Point3_클래스
3차원 자료를 나타내기 위한 자료형.
멤버 변수 : x, y, z.
‘Point3‘ 와 ‘i’, ‘f’, ‘d’ 문자를 조합
Size_ 클래스
이미지나 사각형의 크기를 규정하는 템플릿 클래스.
멤버 변수 : width, height.
_Tp는 템플릿 자료형을 말하는 것 int, float, double등 모든 자료형이 가능함.
Size_<int> sz(width, height);
_Tp area(); - Size_() 생성자
_Tp_width 너비 값
_Tp_height 높이 값
Size_& sz Size Size_클래스 및 CvSize 구조체를 이용하여 선언 가능
Point_<_Tp>& pt Point_클래스를 이용하여 선언 가능
_Tp area() 내부 영역의 넓이를 계산하여 반환
Rect_ 클래스
2차원의 사각형 정보를 나타내기 위한 템플릿 클래스.
멤버 변수 : 시작 좌표 (x, y)와 크기(width, height).
내부 메서드
Rect_::tl() : 시작 좌표 반환
Rect_::br() : 종료 좌표를 반환
Rect_::size() : 사각형의 크기 반환
Rect_::area() : 사각형의 영역 반환
Vec 클래스
원소 개수가 작은 숫자 벡트를 위한 템플릿 클래스.
‘<’ ‘>’ 안에 데이터의 자료형뿐만 아니라 원소의 개수를 인자로 받음.
Vec<Tp, 2> = Point_ , Vect<Tp, 3> = Point3_ , Vect<Tp, 4> = Scalar_ 형변환 가능.
벡터 원소들 접근 = 배열첨자 [ ] 사용.
‘Vec’ ‘b’, ‘i’, ‘f’, ‘d’ 간결 선언 가능.
Scalar_ 클래스
Vec 클래스 중에서 Vec<Tp, 4>에서 파생된 템플릿 클래스.
4개의 원소를 가짐.
OpenCV에서 특별히 화서의 값을 지정하기 위한 자료형으로 정의.
파랑, 초록, 빨강, 투명도 저장.
초기화 할 때 4개의 값을 모두 지정하지 않으면 나머지는 0으로 설정.
RotatedRect 클래스
회전된 사각형으 나타내기 위한 클래스.
클래스 생성자 : RotatedRect();
멤버 변수 : 중심점(center), 크기(size), 회전 각도(angle).
크기 = 회전사각형 내부의 가로와 세로.
회전 각도는 3시방향이 0도, 시계방향을 증가.
Mat 클래스
n-차원의 밀집형 배열 클래스
Mat 클래스 데이터 저장 :
단일 채널 or 다중 채널의 값
실수나 복소수로 구성된 벡터
명암도(gray-scale) 영상이나 컬러 영상 데이터
점의 집합
히스토그램 데이터
생성자 : Mat::Mat();
Mat::Mat(int rows, int cols, int type)
Mat 객체를 생성할 때에는 행렬의 자료형과 데이터 원소의 자료형이 맞지 않을 시 문제.
ex) uchar 행렬은 0~255까지의 범위를 갖기 때문에 300으로 초기화하여도 255의 값이 저장.
배열을 이용하여 행렬의 값을 초기화할 때, 자료형이 일치하지 않으면, 에러가 발생.
ex) 같이 배열 원소와 행렬 원소의 자료형의 크기 차이로 인해서 잘못된 위치에 데이터 값이 설정.
즉, short형 행렬(2바이트)에 int형 배열(4바이트)로 초기화하기 때문에 int형 배열의 한 원소가 행렬의 2개 원소에 걸쳐서 할당.
Mat 클래스의 객체를 선언할 때 ,행렬의 자료형에 특히 주의해야 한다.
행렬의 자료형의 종류
데이터 형 |
설명 |
depth 값 |
CV_8U |
uchar(unsigned char) |
0 |
CV_8S |
signed char |
1 |
CV_16U |
unsigned short int |
2 |
CV_16S |
signed short int |
3 |
CV_32S |
int |
4 |
CV_32F |
float |
5 |
CV_64F |
double |
6 |
Mat 행렬 초기화 함수
Mat 클래스의 내부 메스드 중에서 단위행렬이나 1로 구성된 행렬 등의 특수한 생렬을 생성.
Mat의 객체로 행렬의 곱과 행렬의 합 등 행렬 계산 수식에 사용하고자 할 때, 원소를 쉽게 초기화 가능.
ones() : 행렬의 모든 원소 1인 행렬을 반환.
eye() : 지정된 크기와 타입의 단위 행렬을 반환.
zeros() : 행렬의 원소를 0으로 초기화.
Mat_ 클래스를 이용한 초기화
Mat 클래스에서 상속된 템플릿 클래스.
기존 Mat클래스의 멤버 변수와 가상 메스드만 가짐.
따라서 Mat 클래스와 Mat_ 클래스 간에 참조와 포인터를 자유롭게 변환.
행렬 원소 접근 연산을 많이 하거나 컴파일 타임에 행렬의 자료형을 알고 있는 경우에 Mat_ 클래스를 사용하는 것이 유용.
Mat_ 객체를 선언할 때에 << 연산자를 이용하여 개별 원소를 한 번에 초기화 할 수 있기 때문에 원소의 개수가 작은 행렬의 값을 쉽게 지정할 수 있다.
Matx 클래스를 이용한 초기화
크기가 작은 행렬을 위한 템플릿 클래스.
객체를 선얼할 때 클래스 이름과 ‘<’ 와 ‘>’ 안에 행렬의 자료형, 행수, 열수를 지정하면 해당하는 자료형과 크기의 행렬이 생성.
생성된 객체의 원소에 접근하기 위해서는 객체이름에 (i, j) 형식으로 간편하게 지정하는 장점.
대부분의 행렬 연산들을 지원, 지원되지 않는 행렬 연산은 Mat형색으로 형변환 후에 처리하고 다시 원래 형식을 바꿈.
Mat 클래스의 다양한 속성
멤버변수
Mat::dims 차원 수
Mat::rows 행의 개수
Mat::cols 열의 개수
Mat::data 행렬 원소 데이터에 대한 포인터
Mat::step 행렬의 한 행이 차지하는 바이트 수
멤버 메서드
Mat::channels() 행렬의 채널 수 반환
Mat::depth() 행렬의 깊이값 반환
Mat::size() 행렬의 크기를 Size형으로 반환
Mat::type() 행렬의 데이터 타입 반환
Mat 클래스의 크기 및 형태 변경
영상처리 과정에서 영상 데이터는 행렬로 다루어 처리한다. 이때, 기존에 만들어져 있는 행렬의 행 혹은 열의 개수를 변경해야 하는 경우가 종종 생긴다.
여기서 행렬의 크기를 쉽게 바꾸어 주는 Mat 클래스의 내부 메서드가
Mat::resize() : 행의 개수를 기준으로 기존 행렬의 크기를 변경한다.
Mat::reshape() : 행렬의 전체 원소 개수는 바뀌지 않으면서, 행렬의 모양을 변경하여 새 행렬을 반환한다.
reshape(채널 수 , 행 수)
void create() : 기존에 존재하는 행렬의 차원, 행, 열, 자료형을 변경하여 다시 생성.
int rows, int cols : 행렬의 행과 열의 개수.
int type : 행렬 원소의 데이터 타입.
int* sizes : 행렬의 크기를 나타내는 정수 배열.
Mat 복사 및 자료형 변환
원본 영상에 대해서 이진화, 모폴로지 연산 등과 같은 전처리 작업이나 히스토그램 계산, 객체 외각 추출, 직선 검출 등 다양한 처리 작업에 원본 영상이 변경될 수 있으므로 복사본을 만들어 작업.
uchar형으로 로드된 원본 영상은 영상 처리 과정에서 int형이나 double형 등으로 자료형이 변환되어야 할 때가 종종 있다.
Mat clone() : 행렬 데이터와 같은 값을 복사해서 새로운 행렬을 반환한다.
void copyTo() : 행렬 데이터를 인자로 입력된 mat 행렬에 복사한다.
-Mat mat : 복사될 목적 행렬
-Mat mask : 행렬 데이터를 이나로 입력된 mat 행렬에 복사한다.
void converTo() : 행렬 원소의 데이터 타입을 변경하여 인수로 입력된 mat 행렬에 반환한다.
-Mat mat : 데이터 타입이 변경될 목적 행렬
-int type : 변경하ᅟᅩᆨ자 하는 데이터 타입
-double alpha : 원본 행렬의 원소 값의 배율 지정
-double beta : 원본 행렬의 원소 값에 대한 이동값
벡터(std::vector) 클래스
C++ 언어의 표준 템플릿 라이브러리의 시퀀스 컨테이너로서 동적 배열구조를 C++로 구현한 템플릿 클래스.
C언어의 배열처럼 빠른 임의 접근이 가능하면서도, 원소의 추가 및 삭제가 용이하다. 뿐만 아니라 배열 크기가 자동으로 조절되어 편리하게 사용 가능.
vector() : 생성자
vector 클래스의 사용
백터 객체는 일반 배열처럼 첨자 연산자 []를 이용해서 원소에 접근한다.
전체 원소의 크기를 vector::size()를 통해 확인할 수 있다.
백터 객체의 현재 할당된 용량은 vector::capacity()를 통해서 확인할 수 있다.
vector::reserve()를 이용해 미리 벡터의 용량을 확보한다.
Range 클래스
하나의 시퀀스에서 연속되는 서브 시퀀스를 지정하는 클래스.
Mat 클래스에서 행 또는 열의 범위를 지정할 때 사용.
멤버 변수 : start, end
start에서 end 까지의 연속되는 범위를 규정
행렬을 영상 파일로 저장
행렬을 영상 파일로 저장하기 위해서는 cv::imwrite() 함수 사용.
카메라에서 프레임 읽기
VideoCapture 클래스 이용하면 PC 카메라나 비디오 파일에서 쉽게 프레임을 가져와서 행렬에 저장 가능.
VideoCapture::get() 함수를 이용해서 카메라의 정보들을 확인.
채널 처리 함수
B, G ,R 각기 독립적인 2차원 정보를 합쳐 놓은 배열.
void merge() : 여러 개의 단일채널 배열로 다중 채널의 배열을 합성.
void split() : 다중 채널 배열을 여러 개의 단일 채널 배열로 분리한다.
void mixChannels() : 명시된 채널의 순서쌍에 의해 입력 배열들(src)로부터 출력 배열들(dst)의 복사한다.
사칙 연산
배열에 대한 사칙 연산은 두 배열의 원소 간에 연산을 수행.
배열(Array)라 함은 행렬과 InputArray 클래스와 OutputArray 클래스를 통칭해서 사용하는 말.
연산 과정에서 mask 배열(Array)은 8비트 단일채널로서, 입력 배열의 원소 좌표 중에서 mask 배열의 원소가 0이 아닌 좌표만 연산 대상으로 한다.
ex) add(m1, m2, m_add2, mask); // 관심영역만 덧셈 수행
m1.convertTo(m1, CV_32F);
m2.convertTo(m2, CV_32F); // 형변환 – 소수부분 보존
논리(비트) 연산 함수
void bitwise_and() : 두 배열의 원소 간 혹은 배열 원소와 스칼라 간에 비트 간 논리곱 연산을 수행. src1, srrc2 중 하나는 스칼라값.
void bitwise_or() : 두 개의 배열 원소 간 혹은 배열 원소와 스칼라 간에 비트 간 논리합 연산을 수행.
void bitwise_xor() : 두 개의 배열 원소 간 혹은 배열 원소와 스칼라 간에 비트 간 배타적 논리합 연산.
void bitwise_not() : 입력 배열의 모든 원소에 대해서 각 비트의 역을 계산.
이진화는 cv::threshold() 함수를 사용.
절댓값, 최댓값, 최솟값 관련 함수
cv::abs() 함수를 적용.
MatExpr abs() : 행렬의 각 원소에 대한 절댓값을 계산하여 수식을 위한 행렬인 MatExpr 객체로 반환.
void absdiff() : 두 배열간 각 원소 간 차분의 절댓값을 계산.
void convertScaleAbs() : 입력 배열의 각 원소에 alpha만큼 배율을 곱하고 beta만큼 더한 후에 절댓값을 계산한 결과를 8비트 자료형으로 반환.
image1.convertTo(image1, CV_16S); // (uchar -> short)
image1.convertTo(image1, CV_8U); // (short -> uchar)
image -> cv_16S -> sub -> abs -> cv_8u -> imshow -> abs diff()
minMaxIdx(image, &minVal, &maxVal);