Mat的初始化以及Mat與數組的相互轉化

轉載https://blog.csdn.net/wangyang20170901/article/details/79006836

Mat類型數據的初始化方法可以有以下兩種:

1、直接初始化

  1. Mat_<float> T_L = (Mat_<float>(3, 1) << -518.97666, 01.20629, 9.14632);  
2、利用數組初始化
  1. float A[4][3] = { 0 };  
  2. Mat A_mat = Mat(4, 3, CV_32F, A);//如果是double類型用64  

  注意:初始化數組時常遇到“無法顯示標識符”的提示,可能用了中文的逗號;

Mat轉化爲數組可以用以下兩種方法:

1、Mat中提供ptr函數

    用ptr訪問任意一行像素的首地址,然後當做指針來讀取這一行的數據,適合一行一行的橫向訪問

  1. Mat M1;  
  2. float* row1 = M1.ptr<float>(0);//獲取第一行首地址  
  3. float b[4] = { 0 };  
  4. for(int i=0;i<4;i++)  
  5. {  
  6.   b[i]=row1[i];//第一行的第i個數賦給b[i]  
  7. }  
2、使用Mat的成員函數at<>()

   直接給i,j賦值就可以隨意訪問圖像中任何一個像素,其中j表示第j行,i表示該行第i個像素。如果訪問所有的變量,效率很低。

  1. 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>);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章