[OpenCV3程式設計入門讀書筆記]基礎影象容器Mat(2)
阿新 • • 發佈:2018-12-04
Mat是一個類,由兩個資料部分組成,分別是矩陣頭和一個指向儲存矩陣所有畫素值的矩陣,其中矩陣頭包含了矩陣尺寸,儲存方法,儲存地址等資訊。
對於OpenCV1.X時代基於C語言構建的影象儲存格式IplImage*,如果在退出之前忘記release就會造成記憶體洩漏。而在OpenCV2.0之後的版本,使用了Mat結構取而代之,OpenCV變得像MATLAB那樣上手很方面。
關於Mat類:
(1)不必手動開闢空間
(2)不必在不再需要的時候立即釋放掉
賦值運算子和拷貝建構函式只複製資訊頭,不是深拷貝。
Mat A ,C; //僅建立資訊頭部分 A = imread("1.jpg",CV_LOAD_IMAGE_COLOR); //這裡為矩陣開闢記憶體 Mat B(A); //使用拷貝建構函式 C = A; //賦值運算子
使用函式clone()或者copyTo()可以深拷貝。
Mat F = A.clone();
Mat G;
A.copyTo(G);
建立一個感興趣區域只要建立包含邊界資訊的資訊頭。
Mat D(A,Rect(10,10,100,100));//使用矩形界定
Mat E = A(Range:all(),Range(1,3)); //使用行和列界定
建立Mat物件的七種方式:
- 使用Mat()建構函式
Mat M(2,2,CV_8UC3,Scalar(0,0,255));
- 在C/C++中通過建構函式進行初始化
int sz[3] = {2,2,2}; Mat L(3,sz,CV_8UC3,Scalar::all(0));
上面的例子展示瞭如何建立一個超過二維的矩陣,第二引數傳遞了一個指向陣列的指標,這個陣列包含了每個維度的尺寸。
- 為已存在的IplImage指標建立資訊頭
- 利用Create()函式
M.Create(4,4,,CV_8UC(2));
- 採用Matlab的初始化方式:包括zeros(),ones(),eyes()。
Mat E = Mat::eye(4,4,CV_64F); //單位矩陣 Mat E = Mat::ones(4,4,CV_64F); Mat E = Mat::zeros(4,4,CV_64F);
- 對小矩陣使用逗號分隔式初始化函式
Mat C = (Mat_<double>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);
- 為已存在的物件建立新的資訊頭
Mat RowClone = C.row(1).clone();