【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 矩陣元素的數據類型