**Mat::dims**
멤버 변수 ⇒ Mat 행렬의 차원
**Mat::rows
,Mat::cols
멤버 변수 ⇒ 2차원 행렬의 크기 🌟**
Mat::size
멤버 변수를 이용해 참조
**Mat::data**
멤버 변수 ⇒ 행렬의 원소 데이터가 저장되어 있는 메모리 공간을 가리키는 포인터형 멤버 변수
Mat클래스의 모든 멤버 변수는 public 접근지시자로 선언되어 있음
→ 외부에서 직접 접근 O
다양한 자료형의 원소를 가질 수 O
Mat 클래스의 원소는 하나의 값을 가질 수도 있고, 또는 여러 개의 값이 모여 하나의 원소로 표현됨
unsigned char, signed char, unsigned short, signed short, int, float, double 자료형을사용하는Mat 행렬을지원
깊이(depth)
: Mat 클래스에서 행렬이 어떤 자료형을 사용하는 지에 대한 정보
→ CV_<bit-depth>{U|S|F}
U : 부호 없는 정수형 (unsigned char)
S : 부호 잆는 정수형 (signed char)
F : 부동 소수형 (float)
#define CV_8U 0 // uchar, unsigned char
#define CV_8S 1 // schar, signed char
#define CV_16U 2 // ushort, unsigned short
#define CV_16S 3 // signed short
#define CV_32S 4 // int
#define CV_32F 5 // float
#define CV_64F 6 // double
#define CV_16F 7 // float16_t
ex) 행렬 원소를 float 자료형으로 선언 → CV_32F
Mat 행렬 원소는 하나의 값(채널)을 가질 수도 있고, 여러 개로 구성된 값을 가질 수도 있음
채널(channel)
: Mat 행렬 원소를 구성하는 각각의 값
하나의 행렬을 구성하는 각 채널은 모두 같은 자료형 사용
Mat 객체의 타입(type)
: Mat 행렬의 깊이 정보(자료형) + 채널 수 정보 → 매크로 상수로 표현
CV_<bit-depth>{U|S|F}C(<number_of_channels>)
CV_8UC1
→ 8비트 unsighed char, 채널이1개인 행렬 또는 영상CV_32FC2
→ 복소수처럼 두개의 실수 값 사용
**Mat
클래스의 기본 생성자** 이용
Mat img1;
Mat 객체를 생성함과 동시에 원소 값 저장을 위한 메모리 공간 할당
⇒ Mat::Mat(int rows, int cols, int type);
• rows | 새로 만들 행렬의 행 개수(영상의 세로 크기) |
---|---|
• cols | 새로 만들 행렬의 열 개수(영상의 가로 크기) |
• type | 새로 만들 행렬의 타입 |
ex)
Mat img2(480, 640, CV_8UC1); //unsigned char, 1-channel, **그레이스케일**
Mat img2(480, 640, CV_8UC3); //unsigned char, 3-channel, **트루컬러**
→ 세로크기(rows), 가로크기(cols) 순서임 점에 주의
**Size**
클래스 → mat 클래스 생성자에서 행렬의 크기 지정
⇒ Mat::Mat(Size size, int type);
• size | 새로 만들 행렬의 크기. Size(cols, rows) 또는 Size(width, height) |
---|---|
• type | 새로 만들 행렬의 타입 |
Mat img4(Size(640, 480), CV_8UC3);
// (Size(width, height)Mat::Mat(int rows, int cols, int type, const Scalar& s);
Mat::Mat(Size size, int type, const Scalar& s);
• rows | 새로 만들 행렬의 행 개수(영상의 세로 크기) |
---|---|
• cols | 새로 만들 행렬의 열 개수(영상의 가로 크기) |
• size | 새로 만들 행렬의 크기 |
• type | 새로 만들 행렬의 타입 |
• s | 행렬 원소 초깃값 |
**Scalar 클래스**
→ 네 개의 실수 값을 저장할 수 있는 클래스, 영상 픽셀 값을 표현Mat img5(480, 640, CV_8UC1, Scalar(128)); // initial values, 128
Mat img6(480, 640, CV_8UC3, Scalar(0, 0, 255)); // initial values, red
**Mat::zeros()**
: 모든 원소가 0으로 초기화 된 행렬
static MatExpr Mat::zeros(int rows, int cols, int type);
static MatExpr Mat::zeros(Size size, int type);
• rows | 새로 만들 행렬의 행 개수(영상의 세로 크기) |
---|---|
• cols | 새로 만들 행렬의 열 개수(영상의 가로 크기) |
• size | 새로 만들 행렬의 크기 |
• type | 새로 만들 행렬의 타입 |
• 반환값 | 모든 원소가 0으로 초기화된 행렬 표현식 |
**Mat::
을 붙여서 사용해야 함 🌟**Mat mat1 = Mat::zeros(3, 3, CV_32SC1); // 0's matrix
**Mat::ones()**
: 모든 원소가 1으로 초기화 된 행렬
static MatExpr Mat::ones(int rows, int cols, int type);
static MatExpr Mat::ones(Size size, int type);
**Mat::eye()**
: 단위 행렬 생성
static MatExpr Mat::eye(int rows, int cols, int type);
static MatExpr Mat::eye(Size size, int type);
ex ) Mat::ones()와 Mat::eye() 함수를 사용한 mat 객체 생성 예제
Mat mat2 = Mat::ones(3, 3, CV_32FC1); // 1's matrix
Mat mat3 = Mat::eye(3, 3, CV_32FC1); // identity matrix
기존에 이미 할당되어있는 메모리 공간의 데이터를 행렬 원소 값으로 사용
- 외부 메모리 공간을 활용한 Mat 객체 생성
- 외부 배열의 크기와 생성할 행렬 원소의 개수, 자료형이 같아야 함
Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP);
Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP);
• data | 사용할 (외부) 행렬 데이터의 주소. 외부 데이터를 사용하여 Mat 객체를 생성할 경우, 생성자에서 원소 데이터 저장을 위한 메모리 공간을 동적으로 할당하지 않음 |
---|---|
• step | (외부) 행렬 데이터에서 한 행이 차지하는 바이트 수. 만약 외부 행렬 데이터의 각 행에 여분의 패딩 바이트(padding byte)가 존재한다면 명시적으로 지정해야 함. 만약 기본값 AUTO_STEP을 사용하면 패딩 바이트가 없다고 간주 |
기존에 이미 할당되어있는 메모리 공간의 데이터를 행렬 원소 값으로 사용
- 외부 메모리 공간을 활용한 Mat 객체 생성
- 외부 배열의 크기와 생성할 행렬 원소의 개수, 자료형이 같아야 함
Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP);
Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP);
float data[] = { 1, 2, 3, 4, 5, 6 };
Mat mat4(2, 3, CV_32FC1, data);
→ **Mat 객체의 원소 값과 외부 메모리 공간의 데이터 값이 상호 공유됨**
→ mat4 객체 생성 후 외부 메모리 공간의 값을 변경하면 amt 행렬의 원소 값도 같이 변경
→ 반대로, amt 행렬의 원소 값을 변경해도 외부 메모리 공간의 값도 변경
**Mat_**
클래스를 사용한 객체 생성
Mat_<float> mat5_(2, 3);
mat5_ << 1, 2, 3, 4, 5, 6;
Mat mat5 = mat5_;
Mat mat5 = (Mat_<float>(2, 3) << 1, 2, 3, 4, 5, 6);
로 생략 가능
**초기화 리스트**
를 이용한 행렬 초기화 → 중괄호{} 사용
Mat mat6 = Mat_<float>({2, 3}, { 1, 2, 3, 4, 5, 6 });
**Mat::create()**
: 비어있는 Mat 객체 또는 이미 생성된 Mat 객체에 새로운 행렬 할당
void Mat::create(int rows, int cols, int type);
void Mat::create(Size size, int type);
mat4.create(256, 256, CV_8UC3); // 256x256, uchar, 3-channels
mat5.create(4, 4, CV_32FC1); // 4x4, float, 1-channel
**= 연산자 재정의**
,**Mat::setTo()**
: create() 함수로 행렬 생성 후 행렬 전체 원소 값 초기화
Mat& Mat::operator = (const Scalar& s);
• s | 행렬 원소에 설정할 값 |
---|---|
• 반환값 | 값이 설정된 Mat 객체의 참조 |
Mat& Mat::setTo(InputArray value, InputArray mask = noArray());
• value | 행렬 원소에 설정할 값 |
---|---|
• mask | 마스크 행렬. 마스크 행렬의 원소가 0이 아닌 위치에서만 value 값이 설정 |
행렬 전체 원소 값을 설정하려면 noArray() 또는 Mat()을 지정 | |
• 반환값 | Mat 객체의 참조 |
mat4 = Scalar(255, 0, 0); // = 연산자, mat4 영상의 모든 픽셀 파란색으로 초기화
mat5.setTo(1.f); // setTo() -> 행렬의 모든 원소 값 1.f로 설정
void MatOp1()
{
Mat img1; // 빈 매트릭스
Mat img2(480, 640, CV_8UC1); // unsigned char, 1-channel
Mat img3(480, 640, CV_8UC3); // unsigned char, 3-channels
Mat img4(Size(640, 480), CV_8UC3); // Size(width, height)
Mat img5(480, 640, CV_8UC1, Scalar(128)); // initial values, 128
Mat img6(480, 640, CV_8UC3, Scalar(0, 0, 255)); // initial values, red
Mat mat1 = Mat::zeros(3, 3, CV_32SC1); // 0's matrix 1채널 행렬
Mat mat2 = Mat::ones(3, 3, CV_32FC1); // 1's matrix
Mat mat3 = Mat::eye(3, 3, CV_32FC1); // identity matrix
float data[] = { 1, 2, 3, 4, 5, 6 };
Mat mat4(2, 3, CV_32FC1, data); // 외부 메모리 배열 활용
Mat mat5 = (Mat_<float>(2, 3) << 1, 2, 3, 4, 5, 6);
Mat mat6 = Mat_<uchar>({2, 3}, { 1, 2, 3, 4, 5, 6 });
mat4.create(256, 256, CV_8UC3); // uchar, 3-channels
mat5.create(4, 4, CV_32FC1); // float, 1-channel
mat4 = Scalar(255, 0, 0);
mat5.setTo(1.f);
}