轉載https://blog.csdn.net/wangyang20170901/article/details/79006836
Mat類型數據的初始化方法可以有以下兩種:
1、直接初始化
- Mat_<float> T_L = (Mat_<float>(3, 1) << -518.97666, 01.20629, 9.14632);
- float A[4][3] = { 0 };
- Mat A_mat = Mat(4, 3, CV_32F, A);//如果是double類型用64
注意:初始化數組時常遇到“無法顯示標識符”的提示,可能用了中文的逗號;
Mat轉化爲數組可以用以下兩種方法:1、Mat中提供ptr函數
用ptr訪問任意一行像素的首地址,然後當做指針來讀取這一行的數據,適合一行一行的橫向訪問
- Mat M1;
- float* row1 = M1.ptr<float>(0);//獲取第一行首地址
- float b[4] = { 0 };
- for(int i=0;i<4;i++)
- {
- b[i]=row1[i];//第一行的第i個數賦給b[i]
- }
直接給i,j賦值就可以隨意訪問圖像中任何一個像素,其中j表示第j行,i表示該行第i個像素。如果訪問所有的變量,效率很低。
- M1.at<float>(2, 0)//第三行第一個元素的值
矩陣數據類型:
– CV_<bit_depth>(S|U|F)C<number_of_channels>
S = 符號整型 U = 無符號整型 F = 浮點型
E.g.:
CV_8UC1 是指一個8位無符號整型單通道矩陣,
CV_32FC2是指一個32位浮點型雙通道矩陣
CV_8UC1 CV_8SC1 CV_16U C1 CV_16SC1
CV_8UC2 CV_8SC2 CV_16UC2 CV_16SC2
CV_8UC3 CV_8SC3 CV_16UC3 CV_16SC3
CV_8UC4 CV_8SC4 CV_16UC4 CV_16SC4
CV_32SC1 CV_32FC1 CV_64FC1
CV_32SC2 CV_32FC2 CV_64FC2
CV_32SC3 CV_32FC3 CV_64FC3
CV_32SC4 CV_32FC4 CV_64FC4
其中,通道表示每個點能存放多少個數,類似於RGB彩色圖中的每個像素點有三個值,即三通道的。
圖片中的深度表示每個值由多少位來存儲,是一個精度問題,一般圖片是8bit(位)的,則深度是8.
前面講到IplImage的數據結構,IplImage支持
IPL_DEPTH_8U,無符號8bit整數(8u)
IPL_DEPTH_8S,有符號8bit整數(8s)
IPL_DEPTH_16S,有符號16bit整數(16s)
IPL_DEPTH_32S,有符號32bit整數(32s)
IPL_DEPTH_32F,32bit浮點數,單精度(32f)
IPL_DEPTH_64F,64bit浮點數,雙精度(64f)
IplImage支持1,2,3,4個通道,使用nChannels域標明。CvMat *mat=cvCreateMat(rows,cols,CV_<bit_depth>(S|U|F)C<number_of_channels>);