Opencv中的一些必須理解的簡單概念
1.矩陣頭和矩陣資料空間
在Opencv中資料大多用矩陣表示,我們可以用類Mat聲明一個矩陣頭,但矩陣頭本身並不包含矩陣中的資料,矩陣中的資料存放在Mat的成員data所指向的位置。Opencv通過引用計數自動管理矩陣資料,比如若有一個新的矩陣頭指向矩陣資料空間則引用計數自動增加,若一個指向矩陣資料空間的矩陣頭指向了其它位置或被析構則引用計數自動減少,當引用計數減為0即沒有任何矩陣頭指向該空間時,Opencv自動釋放該資料空間。
同樣我們使用賦值運算複製一個矩陣時,矩陣資料並沒有真正被複製,僅僅是增加了對矩陣資料空間的引用計數以表明新的矩陣頭指向同樣的資料空間。如果需要同時賦值矩陣資料矩陣我們可以用Mat::clone()函數進行深度拷貝。
2.矩陣元素類型
單通道:若矩陣的每一個元素都是標量,則我們稱矩陣是單通道的。對於單通道矩陣,我們可以用下面這個枚舉型變數表示元素的類型
enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, CV_64F=6 };
其中CV是COMPUTER VISION的縮寫,數字8、16、32等表示元素的位元,字母U、S、F分別表示unsigned signed和float的首字母。
例如:CV_32S表示元素類型為32位有符號整形,CV_64F表示64位浮點數。
多通道:若矩陣中的每一個元素是向量,則我們稱矩陣是多通道的。對於多通道矩陣,我們可以用以下常量表示
CV_8UC1 CV_8UC2... CV_64FC3 CV_64FC4
CV_8UC(n)... CV_64FC(n)
以上常量除C(n)外其他字母和數字與單通道矩陣中的意義相同,增加的C是channel的表示通道,n表示通道數目
例如:CV_32FC2表示雙通道32位浮點型資料
3.矩陣資料在空間中的排列
是讀取一副彩色映像所得到的矩陣,觀察他我們可以看到一個3通道二維矩陣在記憶體空間中是如何存放資料的,注意這裡每一個像素是按照BGR排放的,而不是RGB
如所示,矩陣資料是安行排列的。Row0的最後一列銜接Row1的第一列
4.矩陣的連續性
所謂矩陣的連續性,就是指矩陣中的元素在空間上是否處於一段連續的空間。對於由Mat類的建構函式或create()函數所建立的新的矩陣,系統分配的是一段連續的資料空間,這樣的矩陣必然是連續的。但對於由Mat::col(),Mat::colRange(),Mat::diag()等函數建立的矩陣,由上面的講述的矩陣頭和矩陣的資料空間,矩陣資料在空間中的排列等知識可知,這樣的矩陣並沒有分配新的資料空間而是對原資料空間進行了索引,因此若矩陣頭指向的元素在原資料空間中存在間隔,則該矩陣的資料在空間上是不連續的。
我們可以用Mat::isContinuous()函數判斷矩陣是否連續