Class Mat
opencv에서 가장 기본이 되는 데이터 타입으로 행렬(Matrix) 구조체이다.
Mat 생성 방법
Mat 생성에는 아래와 같이 매우 다양한 함수들이 존재한다.
C++: Mat::Mat()
C++ : Mat::Mat(int rows, int cols, int type)
C++ : Mat::Mat(Size size, int type)
C++ : Mat::Mat(int rows, int cols, int type, const Scalar& s)
C++ : Mat::Mat(Size size, int type, const Scalar& s)
C++ : Mat::Mat(const Mat& m)
C++ : Mat::Mat(int rows, int cols, int type, void* data, size_t step = AUTO_STEP)
C++ : Mat::Mat(Size size, int type, void* data, size_t step = AUTO_STEP)
C++ : Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange = Range::all())
C++ : Mat::Mat(const Mat& m, const Rect& roi)
C++ : Mat::Mat(const CvMat* m, bool copyData = false)
C++ : Mat::Mat(const IplImage* img, bool copyData = false)
여기서 등장하는 Parameter 중 Type 에 대한 이해가 필요하다.
* Fixed Pixel Type
Mat의 Element가 어떤 타입의 데이터인지를 지정해준다.
Type의 종류로는 다음과 같다.
CV_8UC1 : 8 - bit unsigned integer : uchar(0..255)
CV_8SC1 : 8 - bit signed integer : schar(-128..127)
CV_16UC1 : 16 - bit unsigned integer : ushort(0..65535)
CV_16SC1 : 16 - bit signed integer : short(-32768..32767)
CV_32SC1 : 32 - bit signed integer : int(-2147483648..2147483647)
CV_32FC1 : 32 - bit floating - point number : float(-FLT_MAX..FLT_MAX, INF, NAN)
CV_64FC1 : 64 - bit floating - point number : double(-DBL_MAX..DBL_MAX, INF, NAN)
CV_8UC1 으로 살펴보면
- 8 : bit 단위로서 8bit를 의미
- U : unsigend의 약자, ( U : Unsinged, S : Signed, F : Floating )
- C1 : Channel의 약자이며 1채널을 의미한다. ( 1채널의 경우 C1 을 생략 가능하여 CV_8UC1 = CV_8U 와 같은 값을 지니게 된다. )
이해하기 쉽게 아래 코드를 보면서 알아보자.
imread(Stirng path) : 해당 경로에 있는 이미지 파일을 읽을 수 있다.
imshow(String title, InputArray mat) : 해당 타이틀 명으로 Mat 데이터를 읽어 표시한다. 즉, 위에서 읽어들인 이미지 파일을 보여준다.
Mat 의 정보
이미지를 읽어들여 해당 이미지에 대한 정보를 Mat 형태로 변환하여 이 값을 이용해 Mat에 대한 정보를 살펴보기로 하자. 우선 위에서 읽어들인 이미지 데이터가 들어있는 Mat image 의 정보를 확인해보자.
일반적으로 Color Image 하면 RGB로 구성되어 있다.
즉, RGB는 색상 값을 R,G,B 3개의 값으로 표현하며 Red (255, 0, 0) , Green (0, 255, 0) , Blue (0, 0, 255) 로 나타낼 수 있으며 각각의 범위는 0~255이다.
그러나 opencv에서는 확실하진 않지만 이미지를 RGB 순서가 아닌 BGR 순서로 읽어들인다.
RGB 또는 BGR 각각 값의 범위는 0~255이며 즉, 2의 8승인 8bit 형태이다.
따라서 Mat image 의 data Type 은 CV_8UC3 이다.
그렇다면 Mat image에는 어떤 값들이 어떻게 들어있는 것일까
carTest.jpg 라는 파일은 940 x 626 pixel 크기의 이미지이다. 이를 읽어들인 Mat image는 cols() = 940, rows() = 626 의 값이 들어있다.
즉, Mat image는 940 x 626 형태의 Matrix를 구성하며 각각의 픽셀 위치에 해당하는 BGR 값들이 할당되어 있다.
( 예를들면 Mat image에서 320, 320 지점의 data value는 (122, 233 , 157 ) 이다. )
*Mat Type 참고 표 ( https://stackoverflow.com/questions/10167534/how-to-find-out-what-type-of-a-mat-object-is-with-mattype-in-opencv )
+--------+----+----+----+----+------+------+------+------+
| | C1 | C2 | C3 | C4 | C(5) | C(6) | C(7) | C(8) |
+--------+----+----+----+----+------+------+------+------+
| CV_8U | 0 | 8 | 16 | 24 | 32 | 40 | 48 | 56 |
| CV_8S | 1 | 9 | 17 | 25 | 33 | 41 | 49 | 57 |
| CV_16U | 2 | 10 | 18 | 26 | 34 | 42 | 50 | 58 |
| CV_16S | 3 | 11 | 19 | 27 | 35 | 43 | 51 | 59 |
| CV_32S | 4 | 12 | 20 | 28 | 36 | 44 | 52 | 60 |
| CV_32F | 5 | 13 | 21 | 29 | 37 | 45 | 53 | 61 |
| CV_64F | 6 | 14 | 22 | 30 | 38 | 46 | 54 | 62 |
+--------+----+----+----+----+------+------+------+------+
즉, Mat image 각 픽셀에 BGR 컬러값이 들어있으며 해당 지점에 접근하여 그 값을 확인할 수 있다.
Mat Data 접근 방법은 다음 글에서...