1. 理解cvmat結構的資料型別
新建二維矩陣:cvmat* cvcreatemat(int rows, int cols,int type);
其中type可以是任何預定義型別,其結構為:cv_(s|u|f)c,bit_depth表示儲存乙個數字所需要的位數;s|u|f表示資料型別,即s為有符號的整型,u表示無符號整型,f表示浮點型;number_of_channels表示資料的通道數,即乙個單元裡儲存的數字個數。opencv在為矩陣賦值的時候,依照type的值對資料進行二進位制編碼,並存於對應的記憶體中。當需要從矩陣中取出資料的時候,系統找到指向對應資料的指標,如何對該指標指向的記憶體中的二進位制編碼進行解釋,需要我們指定其資料型別。例如,當type的值為cv_8uc3時,bit_depth的值為8,number_of_channels的值為3,則cv_8uc3表示用8位儲存乙個無符號的整數,乙個儲存單元裡含有3個這種無符號的整數,乙個儲存單元占有3*8=24位的記憶體空間。往矩陣中寫入資料時,系統先把源資料按照8位無符號整數進行編碼,然後按照3個資料一組將編碼寫入對應的記憶體中。取資料時,系統找到指向對應資料的指標,由使用者指定該指標的型別,系統則按照指標的型別來解釋記憶體中的資料。在這裡,我們需要指定該指標的型別為:unsigned char* 型。如果型別不匹配,則會因編碼和解碼規則不一致而導致錯誤。win32系統中,char為1位元組(8位),short為2位元組(16位),long和int為4位元組(32位),float為4位元組(32位),double為8位元組(64位),所以,cv_8uc1對應unsigned char,cv_8sc1對應signed char,cv_16uc1對應unsigned short,cv_16sc1對應signed short,cv_32uc1對應unsigned int或者unsigned long,cv_32sc1對應signed int或者signed long,cv_32fc1對應float,cv_64fc1對應double。以上的通道數都為1。
對應的,在opencv的影象結構iplimage中,變數depth的值可以為:ipl_depth_8u、ipl_depth_8s、ipl_depth_16s、ipl_depth_32s等等,其儲存規則和cvmat結構一致。
2. 理解cvmat結構多通道資料的儲存規則
opencv支援多通道矩陣。在多通道矩陣中,通道的儲存是連續的。例如乙個cv_8uc3型矩陣,其儲存結構為(uchar1,uchar2,uchar3),(uchar1,uchar2,uchar3)……。若有乙個uchar型指標指向該矩陣資料,要將該指標移向下一通道,只需將其加1,;如果想訪問下乙個元素集,則需要家一定的偏移量(這裡為3)。即若有uchar* pt指向uchar1,則pt++指向uchar2,要指向下乙個uchar1需要pt=pt+3。
同樣,在影象結構iplimage中,imagedata的排列方式也是交錯排列的。對於3通道rgb影象來說,imagedata的排列方式為:rgbrgbrgb……。
3. 理解cvmat結構的step元素
step表示矩陣中行的長度,單位為位元組。出於效率的考慮,step的長度為4位元組的整數倍。例如:對於乙個cv_8uc3型別大小為10*10的陣列,每乙個數字佔1個位元組(8位),乙個元素集含有3個數字,佔3個位元組,一行10個元素集,所以一行所佔的記憶體為30個位元組。而在cvmat結構中,由於行數所佔的記憶體要求為4位元組的整數倍,所以opencv會在每一行的結尾添2個空位元組,於是每一行所佔的記憶體為32個位元組。
與cvmat類似,影象結構iplimage中,元素widthstep表示影象中行的長度,單位為位元組,且也必須為4位元組的整數倍。如果實際長度不是4位元組的整數倍,則在每一行的結尾設定冗餘位元組,使其為4位元組的整數倍。
4. 理解cvmat結構中指向資料體的指標
在cvmat中,指向資料體的指標被設定為union型別:
uniondata;
雖然每乙個指標變數長度都一樣(4位元組) ,但它代表了對資料體的解釋方法。例如:data.ptr表示資料體為uchar型,data.s表示資料體為short型等等。若有乙個cv_32fc3型二維陣列mat,指向第i行的指標可以用以下語句來表示:
float* ptr = (float*) (mat->data.ptr+mat->step*i);
或者 float* ptr = mat->data.fl+mat->step/sizeof(float)*i;
前一種方法首先將資料看成uchar型,加入偏移量後將指向資料體的指標強制轉換為float*型。由於uchar型資料只佔乙個位元組,和step的單位一致,所以偏移量為step*i;
後一種方法直接將資料看成float型然後加入偏移量。由於float資料所佔的位元組數為sizeof(float),所以偏移量為step/sizeof(float)*i,其中,每行的偏移量為step/sizeof(float)。
與cvmat不同的是,在影象結構iplimage中,指向影象資料的指標imagedata總是uchar*型的。所以在影象資料進行指標運算的時候,可以直接增加widthstep個單位。而不必關心實際資料型別。總之,「當要處理的是矩陣時,必須對偏移量進行調整,因為資料指標可能是非位元組型別;當要處理的是影象時,可以直接使用偏移,因為資料指標總是位元組型別。」(《學習opencv》中文版p51)
openCV cvMat資料結構
1.理解cvmat結構的資料型別 新建二維矩陣 cvmat cvcreatemat int rows,int cols,int type 其中type可以是任何預定義型別,其結構為 cv s u f c,bit depth表示儲存乙個數字所需要的位數 s u f表示資料型別,即s為有符號的整型,u表...
opencv CvMat矩陣結構
用於新建乙個二維矩陣的例程 cvmat cvcreatemat int rows,int cols,int type type預定義型別 cv s u f c例 32位浮點型資料 cv 32fc1 無符號的8位三元組的整型資料 cv 8uc3 矩陣的建立和釋放 create a new rows b...
資料結構 資料結構緒論
資料結構是相互間存在一種或多種特定關係的資料元素的集合。程式設計 資料結構 演算法 資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及他們之間的關係和操作等相關問題的學科。資料元素是組成資料的 有一定意義的基本單位,是計算機中通常作為整體處理,也被稱為記錄。乙個資料元素可以由若干個資料項組...