cv::Mat 圖像格式 (Data Type)
命名規則
通用的參數命名格式為:
- CV_{元素比特數}{元素類型}C{通道數}
1最常見的 CV_8UC3 就表示為 3通道Unsigned 8bits 格式的矩陣
- 8U:8bit unsigned
- C3:通道數為 3
2有些圖片存儲格式是 32位float ,則對應的圖像格式為:CV_32FC1,CV_32FC2,CV_32FC3 等;
3如果圖片存儲格式是 64位double ,則對應的圖像格式為:CV_64FC1,CV_64FC2,CV_64FC3 等。
int值映射關系
矩陣元素的數據類型也可用不同的 int 值來替代,其對應關系如下表:
取值范圍
at所訪問的數據類型
由於 at 方法接受的是 uchar 這樣的數據類型,而非 CV_8U。 若是要使用 at 方法訪問數據元素,在已知通道數和每個通道數據類型的情況下,指定給 at 方法的數據類型如下表所示:
- 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
使用無參數構造函數,創建Mat對象
Mat image = Mat(); image.create(4, 4, CV_8UC3);
或者
Mat m = Mat(4, 4, CV_8UC3)
此刻表示創建一個4x4大小的像素塊,每個像素都是三通道每個通道的位數都是8位,一個字節的。上述CV_8UC3中的8表示8位、UC表示uchar類型、3表示三個通道。
樣例2
使用行、列、類型、Scalar向量四個參數的構造函數創建Mat對象
Mat m = Mat(4, 4, CV_8UC3, Scalar(0, 255, 255);
或者
Mat m = Mat(Size(4, 4), CV_8UC3, Scalar(255, 0, 0));
同樣表示創建一個4x4的像素塊,唯一不一樣的是顏色不是默認值而是我們指定的三通道顏色值向量Scalar(0, 255, 255)。其中Scalar向量數目永遠是等於通道數目