1. 程式人生 > >Opencv Mat矩陣中data、size、depth、elemSize、step等屬性的理解

Opencv Mat矩陣中data、size、depth、elemSize、step等屬性的理解

  • data:  
       uchar型別的指標,指向Mat資料矩陣的首地址。可以理解為標示一個房屋的門牌號;
  • dims: 
        Mat矩陣的維度,若Mat是一個二維矩陣,則dims=2,三維則dims=3,大多數情況下處理的都是二維矩陣,是一         個平面上的矩陣。

        可以理解為房屋是一個一層的平房,三維或更多維的則是多層樓房;

  • rows:
        Mat矩陣的行數。可理解為房屋內房間行數;
  • cols: 
        Mat矩陣的列數。可理解為房屋內房間列數;
  • size():
        首先size是一個結構體,定義了Mat矩陣內資料的分佈形式,數值上有關係式:

         image.size().width==image.cols;        image.size().height==image.rows                                                      

         可以理解為房屋內房間的整體佈局,這其中包括了房間分別在行列上分佈的數量資訊;

  • channels():
        Mat矩陣元素擁有的通道數。例如常見的RGB彩色影象,channels==3;而灰度影象只有一個灰度分量資訊,             channels==1。

        可以理解為每個房間內放有多少床位,3通道的放了3張床,單通道的放了1張床;


  • depth: 
        用來度量每一個畫素中每一個通道的精度,但它本身與影象的通道數無關!depth數值越大,精度越高。在                 Opencv中,Mat.depth()得到的是一個0~6的數字,分別代表不同的位數,對應關係如下:                            

        enum{CV_8U=0,CV_8S=1,CV_16U=2,CV_16S=3,CV_32S=4,CV_32F=5,CV_64F=6}          

        其中U是unsigned的意思,S表示signed,也就是有符號和無符號數。

        可以理解為房間內每張床可以睡多少人,這個跟房間內有多少床並無關係;


  • elemSize:
        elem是element(元素)的縮寫,表示矩陣中每一個元素的資料大小,如果Mat中的資料型別是CV_8UC1,那麼             elemSize==1;如果是CV_8UC3或CV_8SC3,那麼elemSize==3;如果是CV_16UC3或者CV_16SC3,那麼             elemSize==6;即elemSize是以8位(一個位元組)為一個單位,乘以通道數和8位的整數倍;

        可以理解為整個房間可以睡多少人,這個時候就得累計上房間內所有床位數(通道)和每張床的容納量了;

  • elemSize1:
        elemSize加上一個“1”構成了elemSize1這個屬性,1可以認為是元素內1個通道的意思,這樣從命名上拆分後就很         容易解釋這個屬性了:表示Mat矩陣中每一個元素單個通道的資料大小,以位元組為一個單位,所以有: 

        eleSize1==elemSize/channels;

  • step:
        可以理解為Mat矩陣中每一行的“步長”,以位元組為基本單位,每一行中所有元素的位元組總量,是累計了一行中所           有元素、所有通道、所有通道的elemSize1之後的值;
  • step1(): 
       以位元組為基本單位,Mat矩陣中每一個畫素的大小,累計了所有通道、所有通道的elemSize1之後的值,所以有:

        step1==step/elemSize1;

  • type:
        Mat矩陣的型別,包含有矩陣中元素的型別以及通道數資訊,type的命名格式為CV_(位數)+(資料型別)+(通道               數),所有取值如下: