C++下的OpenCV中Mat類型存儲的圖像格式

1. Mat數據類型

Mat定義

是一個類,由兩個數據部分構成,矩陣頭(包含矩陣尺寸,存儲方法,存儲地址等等)和一個指向存儲全部像素值的矩陣的指針函數

成員變量

int cv::Mat::cols;     //返回矩陣的列數 
int cv::Mat::rows      // 返回矩陣行數 
uchar* cv::Mat::data   // 指向矩陣的數據單元的指針 
int cv::Mat::dims      // 返回矩陣維度,該維度≥2 
MatSize cv::Mat::size  // 返回矩陣大小

成員函數

獲取圖片高度:mat_name.cols
獲取圖片寬度:mat_name.rows
獲取圖像位深度,(即矩陣元素的存儲方式,存儲每一個像素所用的位數):3d

mat_name.depth()

獲取矩陣通道的數目:指針

mat_name.channnels()

獲取存儲的矩陣元素的數據類型(包括位深度,通道數,數據類型):code

mat_name.type()

建立二維Mat對象

Mat Matrix_name(行數,列數,存儲元素的數據類型,每一個矩陣點的通道數)

存儲元素的數據類型

CV_[位數][帶符號與否][類型前綴]C[通道數]

帶符號與否:S爲符號整型,U爲無符號整型,F爲浮點型
例如CV_8UC3對象

通道數

Scalar是一個short型的向量,可以使用指定的定製化值來初始化矩陣,還能夠用來表示顏色圖片

2. 圖像格式

圖像深度

圖像位深度=比特數+數據類型
C++中OpenCV庫的獲取方式:(函數原型)原型

int Mat::depth()

下表是返回值以及對應含義it

圖像深度 枚舉數值 空間大小 範圍 等同C++變量
CV_8U 0 8bits 0~255 unsigned char
CV_8S 1 8bits -128~127 char
CV_16U 2 16bits 0~65535 ushort,unsigned short int,unsigned short
CV_16S 3 16bits -32768~32767 short,short int
CV32S 4 32bits -2147483648~2147483647 int,long
CV32F 5 32bits 1.18e-38~3.40e38 float
CV_64F 6 64bits 2.23e-308~1.79e308 double
CV_USRTYPE1 7 -

圖像通道數

C++中OpenCV庫的獲取方式:(函數原型)table

int Mat:channels()

圖像類型

圖像類型=比特數+數據類型+通道數
存儲元素的數據類型:變量

CV_[位數][帶符號與否][類型前綴]C[通道數]

帶符號與否:S爲符號整型,U爲無符號整型,F爲浮點型
C++中OpenCV庫的獲取方式:(函數原型)

int Mat:type()

具體數據類型與返回值關係:

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

單個元素的訪問

使用at方式進行訪問,在at的時候須要指定的數據類型對照表以下:

種類 C1 C2 C3 C4 C6
uchar8U uchar cv::Vec2b cv::Vec3b cv::Vec4b
char8S
ushort16U
short16S short cv::Vec2s cv::Vec3s cv::Vec4s
int32S int cv::Vec2i cv::Vec3i cv::Vec4i
float32F float cv::Vec2f cv::Vec3f cv::Vec4f cv::Vec6f
double64F double cv::Vec2d cv::Vec3d cv::Vec4d cv::Vec6d

示例以下:

cv::Vec3b vec3b      = img.at<cv::Vec3b>(0,0);
uchar     vec3b0     = img.at<cv::Vec3b>(0,0)[0];
uchar     vec3b1     = img.at<cv::Vec3b>(0,0)[1];
uchar     vec3b2     = img.at<cv::Vec3b>(0,0)[2];
std::cout<<"vec3b = "<<vec3b<<std::endl;
std::cout<<"vec3b0 = "<<(int)vec3b0<<std::endl;
std::cout<<"vec3b1 = "<<(int)vec3b1<<std::endl;
std::cout<<"vec3b2 = "<<(int)vec3b2<<std::endl;
相關文章
相關標籤/搜索