【opencv】cv::Mat 影像格式 (Data Type)

  • 2020 年 3 月 12 日
  • 筆記

OpenCV使用Mat存影像,有專門的影像格式。

命名規則

通用的參數命名格式為:

CV_{元素比特數}{元素類型}C{通道數}

例如,最常見的 CV_8UC3 中:

  • 8U:8bit unsigned ;
  • C3:通道數為 3 。

因此,

  • CV_8UC3 就表示為 3通道Unsigned 8bits 格式的矩陣,也就是我們常說的 BGR3通道 。 類似的還有:CV_8UC1,CV_8UC2,CV_8UC3 等。
  • 有些圖片存儲格式是 32位float ,則對應的影像格式為:CV_32FC1,CV_32FC2,CV_32FC3 等;
  • 如果圖片存儲格式是 64位double ,則對應的影像格式為:CV_64FC1,CV_64FC2,CV_64FC3 等。

int值映射關係

矩陣元素的數據類型也可用不同的 int 值來替代,其對應關係如下表:

通道數

C1

C2

C3

C4

CV_8U

0

8

16

24

CV_8S

1

9

17

25

CV_16U

2

10

18

26

CV_16S

3

11

19

27

CV_32S

4

12

20

28

CV_32F

5

13

21

29

CV_64F

6

14

22

30

7之所以被跳過了,是因為該數字專門留給用戶自定義:

#define CV_USRTYPE1 7

取值範圍

數值

具體類型

取值範圍

CV_8U

8 位無符號整數

0 ~ 255

CV_8S

8 位符號整數

-128 ~ 127

CV_16U

16 位無符號整數

0 ~ 65535

CV_16S

16 位符號整數

-32768 ~ 32767

CV_32S

32 位符號整數

-2147483648 ~ 2147483647

CV_32F

32 位浮點數

-FLT_MAX ~ FLT_MAX,INF,NAN

CV_64F

64 位浮點數

-DBL_MAX ~ DBL_MAX,INF,NAN

at所訪問的數據類型

由於 at 方法接受的是 uchar 這樣的數據類型,而非 CV_8U。 若是要使用 at 方法訪問數據元素,在已知通道數和每個通道數據類型的情況下,指定給 at 方法的數據類型如下表所示:

C1

C2

C3

C4

C6

uchar

uchar

cv::Vec2b

cv::Vec3b

cv::Vec4b

short

short

cv::Vec2s

cv::Vec3s

cv::Vec4s

int

int

cv::Vec2i

cv::Vec3i

cv::Vec4i

float

float

cv::Vec2f

cv::Vec3f

cv::Vec4f

cv::Vec6f

double

double

cv::Vec2d

cv::Vec3d

cv::Vec4d

cv::Vec6d

其中,

  • Vec2b:表示每個Vec2b對象中,可以存儲2個char(字元型)數據
  • Vec3b:表示每一個Vec3b對象中,可以存儲3個char(字元型)數據,比如可以用這樣的對象,去存儲RGB影像中的
  • Vec4b:表示每一個Vec4b對象中,可以存儲4個字元型數據,可以用這樣的類對象去存儲—4通道RGB+Alpha的圖

對應的 Vec類 的定義如下:

template<typename _Tp, int n> class Vec : public Matx<_Tp, n, 1> {...};    typedef Vec<uchar, 2> Vec2b;  typedef Vec<uchar, 3> Vec3b;  typedef Vec<uchar, 4> Vec4b;    typedef Vec<short, 2> Vec2s;  typedef Vec<short, 3> Vec3s;  typedef Vec<short, 4> Vec4s;    typedef Vec<int, 2> Vec2i;  typedef Vec<int, 3> Vec3i;  typedef Vec<int, 4> Vec4i;    typedef Vec<float, 2> Vec2f;  typedef Vec<float, 3> Vec3f;  typedef Vec<float, 4> Vec4f;  typedef Vec<float, 6> Vec6f;    typedef Vec<double, 2> Vec2d;  typedef Vec<double, 3> Vec3d;    typedef Vec<double, 4> Vec4d;  typedef Vec<double, 6> Vec6d;

參考文獻

[1] Interface [2] LIST OF MAT TYPE IN OPENCV [3] CV_8UC1,CV_8UC2,CV_8UC3 Vec2b Vec3b Vec4b 含義 [4] 確定 OpenCV 矩陣元素的數據類型